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

📅 2026/7/14 11:19:56
【开源】跨语言·跨平台·跨数据库(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跨语言抽象namespaceUserBaoTech.Foundation.ORM{/// summary/// 跨语言数据源接口。/// 业务层只依赖此接口不依赖任何语言特定的数据源类型如 IDataReader、ResultSet 等。/// /summarypublicinterfaceIEntityDataSource{/// summary/// 根据字段名获取当前行的字段值。/// /summaryobjectGetValue(stringfieldName);}}三、.NET 适配器EntityDataReaderAdapterusingSystem.Data;namespaceUserBaoTech.Foundation.ORM{/// summary/// .NET 数据源适配器将 IDataReader 适配为 IEntityDataSource。/// 把语言特定的类型IDataReader封装在适配器内部业务层完全不感知。/// /summarypublicclassEntityDataReaderAdapter:IEntityDataSource{privatereadonlyIDataReader_reader;publicEntityDataReaderAdapter(IDataReaderreader){_readerreader;}publicobjectGetValue(stringfieldName){return_reader[fieldName];}}}四、使用示例4.1 在MapEntityAccessBase.FillByPK中使用publicvirtualboolFillByPK(){// 构建 SQL 和参数...using(varreader_executor.ExecuteReader(sql,parameters)){if(reader.Read()){IEntityDataSourcesourcenewEntityDataReaderAdapter(reader);_entity.LoadFrom(source);returntrue;}}returnfalse;}4.2 在ProductService.GetProductList中使用using(varreader_executor.ExecuteReader(pagedSql,parameters)){IEntityDataSourcesourcenewEntityDataReaderAdapter(reader);while(reader.Read()){varproductnewProduct();product.LoadFrom(source);items.Add(product);}}4.3 业务层完全感知不到IDataReader// Product.LoadFrom 只依赖 IEntityDataSourcepublicoverridevoidLoadFrom(IEntityDataSourcesource){Idsource.GetValue(Id)?.ToString();Namesource.GetValue(Name)?.ToString();PriceConvert.ToDecimal(source.GetValue(Price));StockConvert.ToInt32(source.GetValue(Stock));CreatedAtConvert.ToDateTime(source.GetValue(CreatedAt));UpdatedAtConvert.ToDateTime(source.GetValue(UpdatedAt));IsDeletedConvert.ToBoolean(source.GetValue(IsDeleted));}五、迁移到其他语言时的对应适配器语言适配器类名适配的数据源类型C#EntityDataReaderAdapterIDataReaderJavaEntityResultSetAdapterResultSetArkTSEntityResultSetAdapter鸿蒙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、可跨语言迁移的轻量级基架用宝框架或许是一个值得尝试的选择。用宝框架拥抱第一 · 一次书写 · 三端复用——不仅是用户的朋友而且是用户的宝贝