一步一步教你使用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

posted @ 2010-09-22 09:17  魏琼东  阅读(1804)  评论(10编辑  收藏  举报