IBatis.Net学习笔记九--动态选择Dao的设计分析

转载 2007年09月19日 09:46:00
在IBatis.Net中可以通过配置文件动态选择数据库、动态选择Dao对象。
Dao对象也就是操作数据库的类,通过配置文件我们可以选择DataMapper的方式、Ado的方式、NHibernet的方式以前其他第三方的方式来操作数据库。有利于系统的灵活性和可扩展性。
通过分析动态选择Dao的设计可以加深对IBatis.Net的理解,更好的使用它,同时也可以借鉴它的好的设计模式,应用到我们的程序开发中去。

源代码是最好的分析方式,下面是一些重点代码和说明:
前提:需要在dao.config中配置:
    <daoFactory>
            
<dao interface="GSpring.Dao.Interfaces.IAccountDao, GSpring.Dao" implementation="GSpring.Dao.Implementations.AccountDao, GSpring.Dao"/>
    
</daoFactory>

在代码中首先需要进行初始化:
    DomDaoManagerBuilder builder = new DomDaoManagerBuilder();
    builder.Configure(
"dao.config");
这段代码实际上做了很多事情,其中就有:将所有的配置的dao的接口和实现注册到DaoManager类的静态属性中去。也就是在整个应用程序或网站启动时注册一次就可以了,以后直接从静态属性中取出来使用就可以了。

和dao注册相关的代码如下:
        dao.Implementation = NodeUtils.GetStringAttribute(prop, "implementation");
        dao.Interface 
= NodeUtils.GetStringAttribute(prop, "interface");
        
        _daoInstance 
= _daoImplementation.GetConstructor(Type.EmptyTypes).Invoke(nullas IDao;
        _proxy 
= DaoProxy.NewInstance(this);
也就是把配置文件中的interface和implementation读取,然后生成代理。

最主要的就是最后一句代码,DaoProxy.NewInstance的实现如下:
            Castle.DynamicProxy.ProxyGenerator proxyGenerator = new ProxyGenerator();
            IInterceptor handler 
= new DaoProxy(dao);
            Type[] interfaces 
= {dao.DaoInterface, typeof(IDao)};

            
return (proxyGenerator.CreateProxy(interfaces, handler, dao.DaoInstance) as IDao);
这里我们看到其中使用了Castle.DynamicProxy中的方法(Castle是另外一个开源框架,我和在以后的博客中再说)
DaoProxy实现IInterceptor接口,也就是AOP中常有的拦截机。以后当我们通过IDao接口调用实际的Dao时,都会先通过DaoProxy,由DaoProxy拦截后进行一些必要的处理,然后再动态决定调用哪一个Dao来进行数据库操作

生成好之后都会放在DaoManager的静态属性中,下次要用的时候直接从里面去就可以了:
        public IDao this[Type daoInterface]
        
{
            
get
            
{
                Dao dao 
= _daoMap[daoInterface] as Dao;
                
if (dao == null
                
{
                    
throw new DataException("There is no DAO implementation found for " + daoInterface.Name + " in this context.");
                }

                IDao idao 
= dao.Proxy;
                
return idao;
            }

        }

以上涉及到的主要的类图如下:
 

相关文章推荐

C#与.NET4 高级程序设计-----语言特性 学习笔记

1.重载操作符 C#提供operator 关键字来允许自定义类型对内建操作符做出不同的反映,Operator关键字只能用在静态方法上。[],() 操作符不能被重载。 伪代码:public class ...

《ASP.NET.4高级程序设计》学习笔记2

1.web服务控件 list类型的控件例如droplist,响应多选事件,需要遍历Items集合。 2.数据验证控件   1)RequiredFieldValidator控件,常用于判断一文本框输...

.net排队叫号设计实现方案与学习笔记

一、目前的笔记本基本上都不带串口了,想实现串口功能调试采用转  usb转rs232二、要进行串口通讯就必须了解串口通讯协议,排队叫号需要实现以下功能:1、与物理呼叫终端的通讯当物理呼叫终端触发某个按钮...

MySQL数据库学习笔记(十一)----DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

系列文章并非本人原创。 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4059514.h...

.net学习笔记

  • 2014年02月12日 09:40
  • 3.1MB
  • 下载

VB.net学习笔记(九)委托

Module Sort '声明委托。类似C++的函数指针类型 Public Delegate Function Compare(ByVal v1 As Object, ByVal v2 As ...

.NET学习笔记

  • 2008年07月07日 17:56
  • 38KB
  • 下载

Asp.net控件开发学习笔记(九)----服务器控件事件

EventCollection 如果在单个控件中有多个事件,那么使用System.ComponentModel.EventHandlerList对事件进行保存将会在内存占用上有不错的提高。Event...
  • ytbhhws
  • ytbhhws
  • 2013年11月05日 14:28
  • 559
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IBatis.Net学习笔记九--动态选择Dao的设计分析
举报原因:
原因补充:

(最多只允许输入30个字)