zoukankan      html  css  js  c++  java
  • 一步一步教你使用AgileEAS.NET基础类库进行应用开发基础篇UDA应用中使用IOC解偶数据连接环境

    前文回顾

             前面的三篇文章,我把AgileEAS.NET平台的UDA的应用案例从数据处理方式与流程、基础的语句执行、查询处理以及引入的委托处理机制、事务的两种处理方法,基本上涵盖了基于数据支撑的业务信息系统所涉及的所有数据库处理。

    存在的问题

             前三篇文章中所涉及的例程代码中,对于数据库连接环境程序中定义了一个单例模式工的类UdaContext:

     1     /// <summary>
     2     /// 数据上下文辅助类(不用了)。
     3     /// </summary>
     4     class UdaContext2
     5     {
     6         #region 单例模型
     7 
     8         /// <summary>
     9         /// 内部私有成员,UdaContext对象的唯一实例。
    10         /// </summary>
    11         protected static UdaContext2 instance;
    12         private static readonly object _lock = new object();
    13 
    14         /// <summary>
    15         /// 初始化 UdaContext 对象实例。
    16         /// </summary>
    17         UdaContext2()
    18         {
    19 
    20         }
    21 
    22         /// <summary>
    23         /// ClassProvider对象的唯一实例。
    24         /// </summary>
    25         static UdaContext2 Instance
    26         {
    27             get
    28             {
    29                 if (instance == null)
    30                 {
    31                     lock (_lock)
    32                     {
    33                         if (instance == null)
    34                             instance = new UdaContext2();
    35                     }
    36                 }
    37 
    38                 return instance;
    39             }
    40         }
    41 
    42         #endregion
    43 
    44         IDataConnection dataConnection = null;
    45         IDataAccessor dataAccessor = null;
    46         
    47         /// <summary>
    48         /// IDataConnection比IConnection更加抽像一些。
    49         /// </summary>
    50         /// <remarks>
    51         /// IDataConnection不能支持标准方式的事务,只支持事务代理。
    52         /// </remarks>
    53         public static IConnection Connection
    54         {
    55             get
    56             {
    57                 return DataConnection as IConnection;
    58             }
    59         }  
    60 
    61         public static IDataConnection DataConnection
    62         {
    63             get
    64             {
    65                 if(Instance.dataConnection==null)
    66                     Instance.dataConnection = new OleDbConnection("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=;Initial Catalog=eas;Data Source=vm2003");
    67 
    68                 return Instance.dataConnection;
    69             }
    70         }
    71 
    72         public static IDataAccessor DataAccessor
    73         {
    74             get
    75             {
    76                 if (Instance.dataAccessor == null)
    77                     Instance.dataAccessor = DataConnection.CreateDataAccessor();
    78 
    79                 return Instance.dataAccessor;
    80             }
    81         } 
    82     }

             各示例方法中使用数据操作对象都是通过IDataAccessor accessor = UdaContext.DataAccessor这样的方法事获取数据操纵对象,遥IDataAccessor 又依附于对象IDataConnection之上,在UdaContext类中完成了数据连接环境的实现化:

    if(Instance.dataConnection==null)

            Instance.dataConnection = new OleDbConnection("Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Password=;Initial Catalog=eas;Data Source=vm2003");

             上迷代码实例化了OleDbConnection方式的数据连接环境,平台中提供了OleDbConnection、SqlClientConnection、ODBCConnection连接,当然也实现了独立的Oracle Connection,也就是说应用程序中存在着数据连接的实例化过程,这种方式是有一些问题的。

    使用IOC进行解偶

            既然我们发现了问题,那我们就来解决问题吧,如何解决呢,解决的方案有很多,可以通过抽像工厂模式或者使用其他的N种方式,我就不一一来说了,我推荐使用AgileEAS.NET平台的控制反转(IOC)组件来完成这部分解决,有关AgileEAS.NET平台IOC组件的介绍请参见AgileEAS.NET平台之对象控制反转一文。

            现在我们来改造我们的UdaContext如下:

     1     /// <summary>
     2     /// 辅助类。
     3     /// </summary>
     4     static class UdaContext
     5     {        
     6         /// <summary>
     7         /// IDataConnection比IConnection更加抽像一些。
     8         /// </summary>
     9         /// <remarks>
    10         /// IDataConnection不能支持标准方式的事务,只支持事务代理。
    11         /// </remarks>
    12         public static IConnection Connection
    13         {
    14             get
    15             {
    16                 return DataConnection as IConnection;
    17             }
    18         }  
    19 
    20         public static IDataConnection DataConnection
    21         {
    22             get
    23             {
    24                 return DataAccessor.DataConnection;
    25             }
    26         }
    27 
    28         public static IDataAccessor DataAccessor
    29         {
    30             get
    31             {
    32                 return ContextHelper.GetContext().Container.GetComponentInstance("DataAccessor"as IDataAccessor;
    33             }
    34         } 
    35     }
             这里面关键的是这一句ContextHelper.GetContext().Container.GetComponentInstance("DataAccessor") as IDataAccessor,实现从容器中取出名称为DataAccessor的组件,并完成其他属性与构造注入。

             接下来,我们为这个控制台程序增加一个应用程序配置文件并写如以下内容:

     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="DataAccessor" assembly="EAS.Data" type="EAS.Data.Access.SqlClientAccessor" LifestyleType="Singleton">
    11             <property name="Connection" type="object" value="DataConnection" />
    12         </object>
    13     </EAS.Objects>
    14 </configuration>

             编译程序,运行输出如下结果:

    image         到此为止,有关于AgileEAS.NET平台中的统一数据访问(UDA)组件的案例 示例到此结束,接下来我们开始ORM组件的案案讲解。

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

    链接

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

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

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

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

    AgileEAS.NET官方网站

    敏捷软件工程实验室

    QQ群:116773358

  • 相关阅读:
    mac 使用brew 安装php-redis
    thinkphp6 使用redis 实现消息队列
    Redis 桌面管理器:Another Redis Desktop Manager
    linux 查看并关闭shell脚本执行
    MySQL教程之concat以及group_concat的用法
    PHP redis 使用
    thinkphp6 command(自定义指令)
    git 使用
    linux shell中 "2>&1"含义
    linux crontab 定时任务
  • 原文地址:https://www.cnblogs.com/eastjade/p/1832938.html
Copyright © 2011-2022 走看看