【开源】跨语言·跨平台·跨数据库(4) ——用宝框架 ORM 数据源适配器

【开源】跨语言·跨平台·跨数据库(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

六、设计要点

  1. 接口是跨语言的IEntityDataSource 不依赖任何 .NET 特有类型,可直接移植到 Java/ArkTS
  2. 适配器是语言特定的EntityDataReaderAdapter 依赖 IDataReader,只在 .NET 端使用,不影响跨语言迁移
  3. 适配点集中在一处 :所有 IDataReaderIEntityDataSource 的转换都在适配器中完成,上层代码无需改动
  4. 业务层完全隔离ProductProductAccessProductService 只看到 IEntityDataSource,不感知 IDataReader

七、总结

EntityDataReaderAdapter 是用宝框架 ORM 模块中唯一一处依赖 IDataReader 的地方。迁移到 Java 时,只需实现一个 EntityResultSetAdapter(适配 ResultSet),所有上层代码(实体、Access、Service、Controller)一字不改。

这就是"适配集中化"的价值:迁移代价降到最低。


欢迎拷贝、转载,无需授权

反馈与交流 :欢迎在评论区留言或私信交流。如果你正在寻找一套 不用 EF、不用 Dapper、可跨语言迁移 的轻量级基架,用宝框架或许是一个值得尝试的选择。


用宝框架,拥抱第一 · 一次书写 · 三端复用------不仅是用户的朋友,而且是用户的宝贝

相关推荐
用户1492812178302 小时前
SSE 双队列架构进化之路:从 OOM 到网络漂移,一个后端项目的八次蜕变
ai编程
JZC_xiaozhong2 小时前
OA调价审批后,采购调价单如何自动同步到ERP?解决漏录错价难题
大数据·linux·服务器·前端·数据库·数据孤岛解决方案·数据集成与应用集成
TrisighT2 小时前
Agent 聊了 20 轮 token 翻了 8 倍——三种截断方案实测,最蠢的那种反而最稳
aigc·openai·ai编程
渣渣灰飞2 小时前
MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第一章:企业数据库设计规范
数据库·学习·mysql
奋飛2 小时前
Agent系列:从 grill-me 学写 Skill——先找默认错误,再写最小约束
ai编程
赫媒派2 小时前
MCP Server 安全防护:5 个实用配置清单
ai编程
IvorySQL2 小时前
PG 日报|新增 VFD 缓存监控视图,精细化数据库调优
大数据·数据库·人工智能·缓存·postgresql·区块链
咏方舟【长江支流】2 小时前
【开源】跨语言·跨平台·跨数据库(3) —— 为用宝框架增加ORM,让AI执行
数据库·人工智能·开源·ai编程·orm·咏方舟-长江支流·用宝框架
还好还好不是吗2 小时前
MatrixMedia v0.10.x 更新:B站封面自定义 + 二开指南,开源项目的开发者体验再升级
electron·开源