一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-ORM访问器及其配置

简介:

系列回顾

         本系列前面有三篇文章介绍和演示了AgileEAS.NET平台ORM组件的开发流程及其常见的使用方式,通过前面的三篇文章,大家都可以正常的使用ORM进行正常的开发,本文将提到一个ORM结构性的问题,ORM对象的访问器。

情况说明

         提到ORM访问器,我们就不得不提到一个面对对象设计的问题,那就是到底是对象.操作(),还是操作者.操作(对象),对于这样一个有着争论性并且也没有一个明确最优结果的问题,我也不敢在本文中详细的介绍,我将会在合适的时机发布一个讨论:面向对象设计中的对象.操作()还是操作者.操作(对象)。

访问模式变化

         AgileEAS.NET平台中的ORM最早是基于对象.操作()的这种思路设计的,在最初的版本中ORM实体对象(IEntity)和表对象(ITable)中包含了ORM的基本操作:读取、更新、删除、插件操作:

ZL[HR4XI$@UJX}B91SHHV9A

         我们可以IEntity的定义可以看到,实体记录接口定义了Query、Refresh、Inert、Update、Delete等与数据库同步的操作,也定义了CacheRefresh这样的缓存刷新操作,同样ITable对象也定义了他的操作:

BE6U476]85EMR[]5RKTWO0E

         ITable接口定义了Query、Update、Delete等与数据库同步的操作,也定义了CacheQuery这样的缓存查询操作。

         在最初的ORM实现中,由ITable和IEntity的实现Table和Entity两个基类中直接实现这些方法,实质上在最高的ORM体系中就不存在ITable和IEntity接口,在那时还没有需要要求基于接口驱动。

         至今为止,ORM实体对象(IEntity和ITable)还包含着这一组方法的定义,在漫长的应用开发中prodct.Insert()这样的写法非常的普遍。

         在AgileEAS.NET平台ORM的变迁历史中,有两个事情改变了ORM对象及其访问器体系,第一件事是,同一应用要在不同数据库之上运行的需要驱动了基于接口驱动的数据层开发,也就是提出了ITable和IEntity接口,第二件事是SAAS/分布式应用环境催生了ORM访问器的诞生,进而实现了ORM组件定义与操作的分离。

         下面我们来看一看ORM访问器的定义IOrmAccessor:

4RASB@555GV@5YD19A3W[4I

         缓存访问器ICacheAccessor:

ED2~]YQHXF%W3~3%MTHY]JE

         平台目录在EAS.Data.dll程序中集内置了一个基于数据库连接的ORM访问器(OrmAccessor),他必须基于一个事实存在的数据库连接IConnection和IAccessor访问器,也内置了一个基于内存ORM缓存访问器(CacheAccessor)。

         同时,在AgileEAS.NET平台中实现了基于Remoting技术和WebService技术的分布式技术的分布式ORM访问器。

         有了ORM访问器,我们在应用开发过程中,就可以使用操作者.操纵(对象)这样的模式进行ORM操作,例如ormAccessor.Insert(product)。

两种模式的集成

          AgileEAS.NET平台中的ORM通过ORM访问器提供了操作者.操纵(对象)的这种处理模型,ORM在不同时期实现了这两种不同方法的处理,对于这两种方式,谁也无法说出那个具有决定的优点,一切都是相对的,在操作的方便性上,在面向对象的理论体系上。

          AgileEAS.NET平台中的ORM把实体的定义与访问进行了剥离,然后又把ORM对象与访问器进行了一个集成和粘合,即达到如下的结果:

          1.ORM即可以通过实体.操作()也可以通过访问器.操纵(实体)完成对ORM实体的操纵。

          2.分离ORM实体对象的操作代码,保在ORM实体对象中保留与实体定义相关的代码,实体对象上定义OrmAccessor属性,实现上的操作方法调用Orm访问器的实体操作方法。

          3.ORM实体对象与ORM访问器接口偶尔,基于接口驱动,通过代码或者配置,在运行时使用不同的访问器实现。

          在实际使用中我发两段等效代码:

    /// <summary>
    /// 输出全表数据
    /// </summary>
    public void DemoQuery()
    {
        ProductList table = new ProductList();
        OrmContext.OrmAccessor.Query(table);
        int cols = table.Columns.Count;
        foreach (Product product in table.Rows)
        {
            //do
        }
    }       

          等同于:

    /// <summary>
    /// 输出全表数据
    /// </summary>
    public void DemoQuery()
    {
        ProductList table = new ProductList();
        table.OrmAccessor = OrmContext.OrmAccessor;
        table.Query();
        int cols = table.Columns.Count;
        foreach (Product product in table.Rows)
        {
            //do
        }
    }        

访问器配置

         之前ORM演示的例子我对ORM访问器使用报一个OrmContext进行了声明,在OrmContext类中,对Orm访问器使用直接new的方式进行了实例化:

    /// <summary>
    /// Orm访问器。
    /// </summary>
    public static IOrmAccessor OrmAccessor
    {
        get
        {
            if (Instance.ormAccessor == null)
            {
                Instance.ormAccessor = new OrmAccessor();
                Instance.ormAccessor.DataAccessor = DataAccessor;
            }

            return Instance.ormAccessor;
        }
    }

         从代码中我们看到Instance.ormAccessor = new OrmAccessor(),这样一来应用业务与访问器的实现进行了耦合,Instance.ormAccessor.DataAccessor = DataAccessor; 这一句完成ORM访问器所依赖的数据访问器的注入,程序并没有有效的解耦。

        解决这个问题的办法,还是老方法,使用AgileEAS.NET平台的控制反转(IOC)组件来完成访问器的解耦,有关AgileEAS.NET平台IOC组件的介绍请参见AgileEAS.NET平台之对象控制反转一文。

        首先我们用以下代码替换OrmContext类:


   
   
复制代码
OrmContext
 1       static   class  OrmContext
 2      {
 3           ///   <summary>
 4           ///  Orm访问器。
 5           ///   </summary>
 6           public   static  IOrmAccessor OrmAccessor
 7          {
 8               get
 9              {
10                   return  ContextHelper.GetContext().Container.GetComponentInstance( " OrmAccessor " as  IOrmAccessor;
11              }
12          }
13      }
复制代码

 

         向ClassLib.OrmDemo项目添加一个应用程序配置文件app.config,并写如以下信息:

复制代码
 1  <? xml version="1.0" encoding="utf-8" ?>
 2  < configuration >
 3       < configSections >
 4           < section  name ="EAS.Objects"  type ="EAS.Objects.ConfigHandler,EAS.IOCContainer" />
 5       </ configSections >
 6       < EAS.Objects >
 7           < object  name ="DataConnection"  assembly ="EAS.Data"  type ="EAS.Data.Access.SqlClientConnection"  LifestyleType ="Singleton" >
 8               < property  name ="ConnectionString"  type ="string"  value ="Data Source=vm2003;Initial Catalog=eas;User ID=sa"   />
 9           </ object >
10           < object  name ="OrmAccessor"  assembly ="EAS.Data"  type ="EAS.Data.ORM.OrmAccessor"  LifestyleType ="Singleton" >
11               < property  name ="DbConnection"  type ="object"  value ="DataConnection"   />
12           </ object >
13           <!-- <object name="CacheAccessor" assembly="EAS.Data" type="EAS.Data.ORM.CacheAccessor" LifestyleType="Singleton">
14          </object> -->
15           < object  name ="DataAccessor"  assembly ="EAS.Data"  type ="EAS.Data.Access.SqlClientAccessor"  LifestyleType ="Singleton" >
16               < property  name ="Connection"  type ="object"  value ="DataConnection"   />
17           </ object >
18       </ EAS.Objects >
19  </ configuration >
复制代码

 

         重新编译运行,结束本次演示,在一步篇文章中我将介绍ORM中使用SQL语句实现ORM不能实现的特定业务。  

        有关本例子所涉及的数据表结构请参考基于AgileEAS.NET平台基础类库进行应用开发-总体说明及数据定义一文,有关数据对象模型定义文件、文档、DDL脚本请下载:http://files.cnblogs.com/eastjade/demo.db.doc.sql.rar,本文代码下载:ORM.Demo4.rar。 

 

链接

一步一步教你使用AgileEAS.NET基础类库进行应用开发-系列目录

AgileEAS.NET平台开发指南-系列目录

AgileEAS.NET应用开发平台介绍-文章索引

AgileEAS.NET平台应用开发教程-案例计划

AgileEAS.NET官方网站

敏捷软件工程实验室

QQ群:116773358


作者:魏琼东 
出处:http://www.cnblogs.com/eastjade
关于作者:有13年的软件从业经历,专注于中小软件企业软件开发过程研究,通过在技术与管理帮助中小软件企业实现技术层面开源节流的目的。熟悉需求分析、企业架构、项目管理。现主要从事基于AgileEAS.NET平台的技术咨询工作,主要服务于医疗卫生、铁路、电信、物流、物联网、制造、零售等行业。如有问题或建议,请多多赐教! 
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,可以通过mail.james@qq.com 联系我,也可以加入QQ群:113723486、199463175、116773358、116773358、212867943、147168308、59827496、193486983、15118502和大家共同讨论,非常感谢。


    本文转自魏琼东博客园博客,原文链接:http://www.cnblogs.com/eastjade/archive/2010/10/03/1841534.html,如需转载请自行联系原作者

相关文章
|
4月前
|
人工智能 前端开发 Devops
.NET技术在现代开发中的作用:.NET技术的核心价值、在现代应用开发中的实际应用、以及面临的挑战与未来趋势。
.NET技术是软件开发领域的核心力量,本文从其核心价值、实际应用及未来挑战三方面进行探讨。它支持多种语言,提供强大的开发工具和丰富的类库,并具备跨平台能力。在现代应用开发中,.NET广泛应用于企业级系统、Web应用、移动应用、云服务和游戏开发等领域。面对性能优化、容器化、AI集成等挑战,.NET持续创新以适应不断发展变化的技术环境。
67 4
|
4月前
|
SQL 开发框架 数据库
".NET开发者的超能力:AgileEAS.NET ORM带你穿越数据库的迷宫,让数据操作变得轻松又神奇!"
【8月更文挑战第16天】AgileEAS.NET是面向.NET平台的企业应用开发框架,核心功能包括数据关系映射(ORM),允许以面向对象方式操作数据库,无需编写复杂SQL。通过继承`AgileEAS.Data.Entity`创建实体类对应数据库表,利用ORM简化数据访问层编码。支持基本的CRUD操作及复杂查询如条件筛选、排序和分页,并可通过导航属性实现多表关联。此外,提供了事务管理功能确保数据一致性。AgileEAS.NET的ORM简化了数据库操作,提升了开发效率和代码可维护性。
53 5
|
2月前
|
SQL XML 关系型数据库
入门指南:利用NHibernate简化.NET应用程序的数据访问
【10月更文挑战第13天】NHibernate是一个面向.NET的开源对象关系映射(ORM)工具,它提供了从数据库表到应用程序中的对象之间的映射。通过使用NHibernate,开发者可以专注于业务逻辑和领域模型的设计,而无需直接编写复杂的SQL语句来处理数据持久化问题。NHibernate支持多种数据库,并且具有高度的灵活性和可扩展性。
42 2
|
2月前
|
SQL 开发框架 关系型数据库
值得推荐的.NET ORM框架
值得推荐的.NET ORM框架
|
3月前
|
SQL 存储 关系型数据库
C#一分钟浅谈:使用 ADO.NET 进行数据库访问
【9月更文挑战第3天】在.NET开发中,与数据库交互至关重要。ADO.NET是Microsoft提供的用于访问关系型数据库的类库,包含连接数据库、执行SQL命令等功能。本文从基础入手,介绍如何使用ADO.NET进行数据库访问,并提供示例代码,同时讨论常见问题及其解决方案,如连接字符串错误、SQL注入风险和资源泄露等,帮助开发者更好地利用ADO.NET提升应用的安全性和稳定性。
294 6
|
4月前
|
算法 Java 测试技术
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
|
4月前
|
API
【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)
【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)
|
4月前
|
缓存 数据库连接 API
Entity Framework Core——.NET 领域的 ORM 利器,深度剖析其最佳实践之路
【8月更文挑战第28天】在软件开发领域,高效的数据访问与管理至关重要。Entity Framework Core(EF Core)作为一款强大的对象关系映射(ORM)工具,在 .NET 开发中扮演着重要角色。本文通过在线书店应用案例,展示了 EF Core 的核心特性和优势。我们定义了 `Book` 实体类及其属性,并通过 `BookStoreContext` 数据库上下文配置了数据库连接。EF Core 提供了简洁的 API,支持数据的查询、插入、更新和删除操作。
119 0
|
4月前
【Azure 应用服务】App Service 配置 Application Settings 访问Storage Account得到 could not be resolved: '*.file.core.windows.net'的报错。没有解析成对应中国区 Storage Account地址 *.file.core.chinacloudapi.cn
【Azure 应用服务】App Service 配置 Application Settings 访问Storage Account得到 could not be resolved: '*.file.core.windows.net'的报错。没有解析成对应中国区 Storage Account地址 *.file.core.chinacloudapi.cn