天天看点

一步一步教你使用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,也就是说应用程序中存在着数据连接的实例化过程,这种方式是有一些问题的。

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

 2     /// 辅助类。

 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         }  

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>

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

链接

<a href="http://www.cnblogs.com/eastjade/archive/2010/09/12/1824405.html">AgileEAS.NET平台开发指南-系列目录</a>

<a href="http://www.cnblogs.com/eastjade/archive/2010/09/09/1822530.html">AgileEAS.NET应用开发平台介绍-文章索引</a>

<a href="http://www.cnblogs.com/eastjade/archive/2010/09/19/1830812.html">一步一步教你使用AgileEAS.NET基础类库进行应用开发-系列目录</a>

<a href="http://www.cnblogs.com/eastjade/archive/2010/09/15/1826870.html">AgileEAS.NET平台应用开发教程-案例计划</a>

<a href="http://www.smarteas.net/">AgileEAS.NET官方网站</a>

<a href="http://www.agilelab.cn/">敏捷软件工程实验室</a>

QQ群:116773358

本文转自 agilelab 51CTO博客,原文链接:http://blog.51cto.com/agilelab/603013