前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-UDA应用中使用IOC解偶数据连接环境

一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-UDA应用中使用IOC解偶数据连接环境

作者头像
魏琼东
发布2018-01-12 10:39:11
5720
发布2018-01-12 10:39:11
举报
文章被收录于专栏:魏琼东
前文回顾

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

存在的问题

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

代码语言:js
复制
 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如下:

代码语言:js
复制
 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的组件,并完成其他属性与构造注入。

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

代码语言:js
复制
 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.png
image.png

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2010-09-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前文回顾
  • 存在的问题
  • 使用IOC进行解偶
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档