iBATIS.NET中动态选择DAO浅析

开发 后端
iBATIS.NET中动态选择DAO是如何执行的呢?本文将向你介绍在iBATIS.NET中如何进行动态选择DAO的。

在iBATIS.NET中可以通过配置文件动态选择数据库、动态选择Dao对象。

Dao对象也就是操作数据库的类,通过配置文件我们可以选择DataMapper的方式、ADO的方式、NHibernet的方式以前其他第三方的方式来操作数据库。有利于系统的灵活性和可扩展性。

通过分析动态选择Dao的设计可以加深对iBATIS.NET的理解,更好的使用它,同时也可以借鉴它的好的设计模式,应用到我们的程序开发中去。

源代码是最好的分析方式,下面是一些重点代码和说明:

iBATIS.NET中动态选择DAO前提:需要在dao.config中配置:

  1. <daoFactory>  
  2.         <dao interface="GSpring.Dao.Interfaces.IAccountDao, GSpring.Dao" implementation="GSpring.Dao.Implementations.AccountDao, GSpring.Dao"/>  
  3. </daoFactory> 

iBATIS.NET中动态选择DAO在代码中首先需要进行初始化:

  1. DomDaoManagerBuilder builder = new DomDaoManagerBuilder();  
  2.  
  3.  builder.Configure("dao.config"); 

这段代码实际上做了很多事情,其中就有:将所有的配置的dao的接口和实现注册到DaoManager类的静态属性中去。也就是在整个应用程序或网站启动时注册一次就可以了,以后直接从静态属性中取出来使用就可以了。

和dao注册相关的代码如下:

  1. dao.Implementation = NodeUtils.GetStringAttribute(prop, "implementation");  
  2. dao.Interface = NodeUtils.GetStringAttribute(prop, "interface");  
  3.  
  4. _daoInstance = _daoImplementation.GetConstructor(Type.EmptyTypes).Invoke(null) as IDao;  
  5. _proxy = DaoProxy.NewInstance(this); 

也就是把配置文件中的interface和implementation读取,然后生成代理。

iBATIS.NET中动态选择DAO最主要的就是最后一句代码,DaoProxy.NewInstance的实现如下:

  1. Castle.DynamicProxy.ProxyGenerator proxyGenerator = new ProxyGenerator();  
  2. IInterceptor handler = new DaoProxy(dao);  
  3. Type[] interfaces = {dao.DaoInterface, typeof(IDao)};  
  4.  
  5. return (proxyGenerator.CreateProxy(interfaces, handler, dao.DaoInstance) as IDao); 

这里我们看到其中使用了Castle.DynamicProxy中的方法(Castle是另外一个开源框架,我和在以后的博客中再说)

DaoProxy实现IInterceptor接口,也就是AOP中常有的拦截机。以后当我们通过IDao接口调用实际的Dao时,都会先通过DaoProxy,由DaoProxy拦截后进行一些必要的处理,然后再动态决定调用哪一个DAO来进行数据库操作。

生成好之后都会放在DaoManager的静态属性中,下次要用的时候直接从里面去就可以了:

  1. public IDao this[Type daoInterface]  
  2. {  
  3.     get  
  4.     {  
  5.         Dao dao = _daoMap[daoInterface] as Dao;  
  6.         if (dao == null)   
  7.         {  
  8.             throw new DataException("There is no DAO implementation found for " + daoInterface.Name + " in this context.");  
  9.         }  
  10.         IDao idao = dao.Proxy;  
  11.         return idao;  
  12.     }  

iBATIS.NET中动态选择DAO涉及到的主要的类图如下:

动态选择DAO主要类图

iBATIS.NET中动态选择DAO就向你介绍到这里,希望这些对你有所帮助。

【编辑推荐】

  1. iBATIS with MapBean应用浅析
  2. iBATIS.NET常用的查询方式浅析
  3. iBATIS.NET中的多表查询方法浅析
  4. iBATIS.NET日志处理浅析
  5. iBATIS.NET字段映射自定义对象浅析
责任编辑:仲衡 来源: cnblogs
相关推荐

2009-07-22 09:07:01

iBATIS.NET

2009-07-20 13:22:47

iBATIS.Net日

2009-07-20 09:27:42

IBATIS.netDAO

2009-07-20 10:06:07

iBATIS.net查询方式

2009-07-21 13:50:00

iBATIS.NET调

2009-07-21 15:21:59

iBATIS.NET多

2009-07-20 09:51:19

iBATIS.net数据库缓存

2009-07-16 13:50:31

ibatisResultMap

2009-07-20 13:47:08

iBATIS.NET字

2009-07-16 09:14:26

iBATIS DAO

2009-07-20 18:00:16

iBATIS DAO事

2009-07-20 15:14:44

iBATIS.NET连

2009-07-21 11:17:46

iBATISDAO的配置

2009-07-21 16:30:15

iBATIS.NET与单元测试

2009-07-20 15:27:22

Castle.DynaiBATIS.NET

2009-07-21 17:06:35

iBATIS.NET执

2009-07-22 14:28:52

iBATIS.NET配

2009-07-15 17:58:07

iBATIS 动态映射

2009-07-22 14:11:09

配置ibatis.neiBatis.net配

2009-07-21 14:15:00

iBATIS.NET多
点赞
收藏

51CTO技术栈公众号