基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - ORM访问器
上一篇文章AgileEAS.NET之数据关系映射ORM简单介绍了一下AgileEAS.NET平台中ORM对象的组织机构体系,但并没有对其所执行的数据存取操作介绍,在AgileEAS.NET中,我对ORM实体及其上的数据操作实现进行了分离,实体对象只呈现数据,而实体的增加、修改、更新、删除、缓存操作都通过ORM访问器实现。
在AgileEAS.NET两个访问器IOrmAccessor和ICacheAccessor访问器。
IOrmAccessor完成ORM对象(实体和表)和数据库的交互工作:查询、增加、修改、删除极其辅助任务,其接口详细定义如下:
/// <summary> /// 定义ORM访问器接口。 /// </summary> public interface IOrmAccessor : IOrmEnvironment { /// <summary> /// 保存数据实体。 /// </summary> /// <param name="entity">数据实体。</param> void Save(IEntity entity); /// <summary> /// 保存数据表。 /// </summary> /// <param name="table">表。</param> void Save(ITable table); /// <summary> /// 保存数据表。 /// </summary> /// <param name="table">表。</param> /// <param name="force">是否强制同步到数据库。</param> void Save(ITable table,bool force); /// <summary> /// 保存数据表。 /// </summary> /// <param name="table">表。</param> /// <param name="force">是否强制同步到数据库。</param> /// <param name="transaction">数据同步过程中是否使用事务。</param> void Save(ITable table, bool force, bool transaction); /// <summary> /// 保存数据架构。 /// </summary> /// <param name="schema">架构。</param> void Save(ISchema schema); /// <summary> /// 保存数据架构。 /// </summary> /// <param name="schema">架构。</param> /// <param name="force">是否强制同步到数据库。</param> void Save(ISchema schema, bool force); /// <summary> /// 保存数据架构。 /// </summary> /// <param name="schema">架构。</param> /// <param name="force">是否强制同步到数据库。</param> /// <param name="transaction">数据同步过程中是否使用事务。</param> void Save(ISchema schema, bool force, bool transaction); /// <summary> /// 插入数据实体。 /// </summary> /// <param name="entity">实体。</param> void Insert(IEntity entity); /// <summary> /// 修改数据实体。 /// </summary> /// <param name="entity">实体。</param> void Update(IEntity entity); /// <summary> /// 删除数据实体。 /// </summary> /// <param name="entity">实体。</param> void Delete(IEntity entity); /// <summary> /// 删除数据表。 /// </summary> /// <param name="table">数据表。</param> /// <remarks> /// 本方法相当于数据批量删除,一次性删除多条记录。 /// </remarks> /// <remarks>删除的记录数。</remarks> int Delete(ITable table); /// <summary> /// 根据条件删除数据表中记录。 /// </summary> /// <param name="table">数据表。</param> /// <param name="condition">数据过滤条件。</param> /// <remarks>删除的记录数。</remarks> int Delete(ITable table, Condition condition); /// <summary> /// 删除数据架构。 /// </summary> /// <param name="schema">架构。</param> /// <remarks> /// 本方法相当于数据批量删除,一次删除多表多条记录。 /// </remarks> void Delete(ISchema schema); /// <summary> /// 刷新数据实体。 /// </summary> /// <param name="entity">实体。</param> /// <returns>数据库中存在指定的数据体则返回true。</returns> bool Refresh(IEntity entity); /// <summary> /// 查询数据实体。 /// </summary> /// <param name="entity">实体。</param> /// <returns>数据库中存在指定的数据体则返回true。</returns> bool Query(IEntity entity); /// <summary> /// 判读实体是否存在于数据库。 /// </summary> /// <param name="entity">实体。</param> bool ExistsInDb(IEntity entity); /// <summary> /// 表查询。 /// </summary> /// <param name="table">表。</param> void Query(ITable table); /// <summary> /// 表查询。 /// </summary> /// <param name="table">表。</param> /// <param name="top">Top查询。</param> void Query(ITable table,int top); /// <summary> /// 表查询。 /// </summary> /// <param name="table">表。</param> /// <param name="condition">数据查询条件。</param> void Query(ITable table, Condition condition); /// <summary> /// 表查询。 /// </summary> /// <param name="table">表。</param> /// <param name="condition">数据查询条件。</param> /// <param name="top">Top查询。</param> void Query(ITable table, Condition condition, int top); /// <summary> /// 查询数据表。 /// </summary> /// <param name="table">表。</param> DataTable GetDataTable(ITable table); /// <summary> /// 查询数据表。 /// </summary> /// <param name="table">表。</param> /// <param name="top">Top查询。</param> DataTable GetDataTable(ITable table, int top); /// <summary> /// 查询数据表。 /// </summary> /// <param name="table">表。</param> /// <param name="condition">数据查询条件。</param> DataTable GetDataTable(ITable table, Condition condition); /// <summary> /// 查询数据表。 /// </summary> /// <param name="table">表。</param> /// <param name="condition">数据查询条件。</param> /// <param name="top">Top查询。</param> DataTable GetDataTable(ITable table, Condition condition, int top); } }
ICacheAccessor完成ORM对象的缓存查询及其辅助任务,其接口详细定义如下:
/// <summary> /// 缓存访问器接口。 /// </summary> /// <remarks> /// 为ORM对象提供缓存查询能力。 /// </remarks> public interface ICacheAccessor : IOrmEnvironment { /// <summary> /// 缓存刷新实体。 /// </summary> /// <param name="entity">实体。</param> void CacheRefresh(IEntity entity); /// <summary> /// 表缓存查询。 /// </summary> /// <param name="table">表。</param> void CacheQuery(ITable table); /// <summary> /// 表缓存查询。 /// </summary> /// <param name="table">表。</param> /// <param name="top">Top查询。</param> void CacheQuery(ITable table, int top); /// <summary> /// 表缓存查询。 /// </summary> /// <param name="table">表。</param> /// <param name="condition">数据查询条件。</param> void CacheQuery(ITable table, Condition condition); /// <summary> /// 表缓存查询。 /// </summary> /// <param name="table">表。</param> /// <param name="condition">数据查询条件。</param> /// <param name="top">Top查询。</param> void CacheQuery(ITable table, Condition condition, int top); /// <summary> /// 缓存查询数据表。 /// </summary> /// <param name="table">表。</param> DataTable GetCacheDataTable(ITable table); /// <summary> /// 缓存查询数据表。 /// </summary> /// <param name="table">表。</param> /// <param name="top">Top查询。</param> DataTable GetCacheDataTable(ITable table, int top); /// <summary> /// 缓存查询数据表。 /// </summary> /// <param name="table">表。</param> /// <param name="condition">数据查询条件。</param> DataTable GetCacheDataTable(ITable table, Condition condition); /// <summary> /// 缓存查询数据表。 /// </summary> /// <param name="table">表。</param> /// <param name="condition">数据查询条件。</param> /// <param name="top">Top查询。</param> DataTable GetCacheDataTable(ITable table, Condition condition, int top); }
IOrmAccessor和ICacheAccessor都基于一个共同的接口IOrmEnvironment,IOrmEnvironment寓意为ORM操纵环境,根据类图可以看到IOrmAccessor和ICacheAccessor也坚决的继续于接口ISessionResource(会话资源),关我在后面的文章中专门介绍。
关于IOrmAccessor和ICacheAccessor详细方法和具体的实现思路我在本文暂时不做介绍,在AgileEAS.NET实现了基于本地数据访问器IDataAccessor的ORM实现,也实现了基于分布式WebService和Remoting的ORM访问器实现,在开发和使用过程中,同一实体对象可以在不同的ORM访问器中进行切换,只需要修改配置文件:
使用本地数据访问器:
<object name="MasterDbConnection" assembly="EAS.Data" type="EAS.Data.Access.OleDbConnection" LifestyleType="Singleton"> <property name="ConnectionString" type="string" value="..." /> </object> <object name="OrmAccessor" assembly="EAS.Data" type="EAS.Data.ORM.OrmAccessor" LifestyleType="Singleton"> <property name="DbConnection" type="object" value="MasterDbConnection" /> </object> <object name="CacheAccessor" assembly="EAS.Data" type="EAS.Data.ORM.CacheAccessor" LifestyleType="Singleton"> </object>
<object name="MasterDataAccessor" assembly="EAS.Distributed.WebServiceClient" type="EAS.Distributed.WebServiceClient.DataAccessor" LifestyleType="Singleton"> <constructor-arg index="0" type="string" value="http://vm2003/Distributed/DataAccessService.asmx" /> </object> <object name="MasterRMIAccessor" assembly="EAS.Distributed.WebServiceClient" type="EAS.Distributed.WebServiceClient.RMIAccessor" LifestyleType="Singleton"> <constructor-arg index="0" type="string" value="http://vm2003/Distributed/RMIService.asmx" /> </object> <object name="OrmTranser" assembly="EAS.Distributed.WebServiceClient" type="EAS.Distributed.WebServiceClient.OrmAccessor" LifestyleType="Singleton"> <property name="DataAccessor" type="object" value="MasterDataAccessor" /> <property name="RMIAccessor" type="object" value="MasterRMIAccessor" /> </object>
QQ群:15118502
作者:魏琼东
出处:http://www.cnblogs.com/eastjade
关于作者:有13年的软件从业经历,专注于中小软件企业软件开发过程研究,通过在技术与管理帮助中小软件企业实现技术层面开源节流的目的。熟悉需求分析、企业架构、项目管理。现主要从事基于AgileEAS.NET平台的技术咨询工作,主要服务于医疗卫生、铁路、电信、物流、物联网、制造、零售等行业。如有问题或建议,请多多赐教!
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过mail.james@qq.com 联系我,也可以加入QQ群:113723486、199463175、116773358、116773358、212867943、147168308、59827496、193486983、15118502和大家共同讨论,非常感谢。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述