【开源】跨语言·跨平台·跨数据库(4) ------用宝框架 ORM 数据源适配器
2026-07-13
作者:周方勇 / 咏方舟-长江支流(金质打印通、用宝框架开源作者)
用宝框架 · 拥抱第一 · 一次书写 · 三端复用
用宝框架是轻量级企业级分层架构基架,也是开放的、可扩展的架构体系 。.NET Standard 2.0,零依赖,支持 MySQL / SQL Server / Oracle / SQLite并可扩展。SQL就是最好的跨平台语言 ,可跨语言无缝迁移至鸿蒙 ArkTS 及 Java 技术栈,接口名、类名、方法签名三端完全一致。
用宝架构开发的所有应用,可直接移植到 Java/ArkTS,无需重新设计架构、无需重新分层、无需重新抽象业务逻辑,只需按目标语言语法做形式上的转换。
本文侧重:为用宝框架增加轻量级 ORM,在不改变核心基架的前提下,获得实体映射 + 自动 SQL 生成能力,增删改查完全不用写代码。其中数据源隔离部分,采用适配器模式,通过 IEntityDataSource 跨语言接口,隔离具体语言的数据源。本篇将20年前无泛型、无依赖注入、无EF时的轻量级设计重新整理,形成完整的设计文档与约束规范,让AI按照规范自动执行生成代码。当然,为了代码生成少些bug,我提供了之前源码,特别是CommandTextBuilder。人工不仅是设计师,更是有与AI沟通的能力,以及程序员协助调试Bug的能力,AI作为执行者将更大幅提升效率。

用宝框架 ORM 数据源适配器设计
上篇做了很详细的设计 【开源】跨语言·跨平台·跨数据库(3) ------ 为用宝框架增加ORM,让AI执行 ,现在已调的有效果了。
经过 AI 协作和一晚的熬夜,用宝框架 ORM 扩展已基本完工。需要源码的,留言并关注,调试过程中,仅粉丝全部源码。
一、项目目录结构
UserBaoTech.Foundation/
├── UserBaoTech.Foundation/ (核心基架)
│ └── ...
├── UserBaoTech.Foundation.UbException/ (异常体系)
│ ├── IUserBaoException.cs
│ └── UserBaoException.cs
├── UserBaoTech.Foundation.ORM/ (ORM扩展,新建)
│ ├── IEntityDataSource.cs (跨语言数据源接口)
│ ├── EntityDataReaderAdapter.cs (.NET 适配器,将 IDataReader 适配为 IEntityDataSource)
│ ├── IMapEntity.cs
│ ├── IMapEntityAccess.cs
│ ├── MapEntityAccessBase.cs
│ ├── AttributeMapEntity.cs
│ └── ManualMapEntity.cs
└── UserBaoTech.Foundation.ORM.Demo.WebAPI/ (演示项目)
├── Entities/
│ ├── Product.cs (特性方式实体)
│ └── ProductByHand.cs (手写方式实体)
├── Access/
│ └── ProductAccess.cs
├── Services/
│ └── ProductService.cs
├── Controllers/
│ └── ProductController.cs
├── Program.cs
└── appsettings.json

二、核心接口:IEntityDataSource(跨语言抽象)
csharp
namespace UserBaoTech.Foundation.ORM
{
/// <summary>
/// 跨语言数据源接口。
/// 业务层只依赖此接口,不依赖任何语言特定的数据源类型(如 IDataReader、ResultSet 等)。
/// </summary>
public interface IEntityDataSource
{
/// <summary>
/// 根据字段名获取当前行的字段值。
/// </summary>
object GetValue(string fieldName);
}
}
三、.NET 适配器:EntityDataReaderAdapter
csharp
using System.Data;
namespace UserBaoTech.Foundation.ORM
{
/// <summary>
/// .NET 数据源适配器:将 IDataReader 适配为 IEntityDataSource。
/// 把语言特定的类型(IDataReader)封装在适配器内部,业务层完全不感知。
/// </summary>
public class EntityDataReaderAdapter : IEntityDataSource
{
private readonly IDataReader _reader;
public EntityDataReaderAdapter(IDataReader reader)
{
_reader = reader;
}
public object GetValue(string fieldName)
{
return _reader[fieldName];
}
}
}
四、使用示例
4.1 在 MapEntityAccessBase.FillByPK 中使用
csharp
public virtual bool FillByPK()
{
// 构建 SQL 和参数...
using (var reader = _executor.ExecuteReader(sql, parameters))
{
if (reader.Read())
{
IEntityDataSource source = new EntityDataReaderAdapter(reader);
_entity.LoadFrom(source);
return true;
}
}
return false;
}
4.2 在 ProductService.GetProductList 中使用
csharp
using (var reader = _executor.ExecuteReader(pagedSql, parameters))
{
IEntityDataSource source = new EntityDataReaderAdapter(reader);
while (reader.Read())
{
var product = new Product();
product.LoadFrom(source);
items.Add(product);
}
}
4.3 业务层完全感知不到 IDataReader
csharp
// Product.LoadFrom 只依赖 IEntityDataSource
public override void LoadFrom(IEntityDataSource source)
{
Id = source.GetValue("Id")?.ToString();
Name = source.GetValue("Name")?.ToString();
Price = Convert.ToDecimal(source.GetValue("Price"));
Stock = Convert.ToInt32(source.GetValue("Stock"));
CreatedAt = Convert.ToDateTime(source.GetValue("CreatedAt"));
UpdatedAt = Convert.ToDateTime(source.GetValue("UpdatedAt"));
IsDeleted = Convert.ToBoolean(source.GetValue("IsDeleted"));
}
五、迁移到其他语言时的对应适配器
| 语言 | 适配器类名 | 适配的数据源类型 |
|---|---|---|
| C# | EntityDataReaderAdapter |
IDataReader |
| Java | EntityResultSetAdapter |
ResultSet |
| ArkTS | EntityResultSetAdapter |
鸿蒙 ResultSet |
六、设计要点
- 接口是跨语言的 :
IEntityDataSource不依赖任何 .NET 特有类型,可直接移植到 Java/ArkTS - 适配器是语言特定的 :
EntityDataReaderAdapter依赖IDataReader,只在 .NET 端使用,不影响跨语言迁移 - 适配点集中在一处 :所有
IDataReader→IEntityDataSource的转换都在适配器中完成,上层代码无需改动 - 业务层完全隔离 :
Product、ProductAccess、ProductService只看到IEntityDataSource,不感知IDataReader
七、总结
EntityDataReaderAdapter 是用宝框架 ORM 模块中唯一一处依赖 IDataReader 的地方。迁移到 Java 时,只需实现一个 EntityResultSetAdapter(适配 ResultSet),所有上层代码(实体、Access、Service、Controller)一字不改。
这就是"适配集中化"的价值:迁移代价降到最低。
欢迎拷贝、转载,无需授权
反馈与交流 :欢迎在评论区留言或私信交流。如果你正在寻找一套 不用 EF、不用 Dapper、可跨语言迁移 的轻量级基架,用宝框架或许是一个值得尝试的选择。
用宝框架,拥抱第一 · 一次书写 · 三端复用------不仅是用户的朋友,而且是用户的宝贝