博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IBatis.Net学习笔记(五)--动态选择Dao的设计分析
阅读量:4582 次
发布时间:2019-06-09

本文共 1841 字,大约阅读时间需要 6 分钟。

在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(
null
as
 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中的方法( 是另外一个开源框架,我和在以后的博客中再说)
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;
            }
        }
以上涉及到的主要的类图如下:

转载于:https://www.cnblogs.com/gooddasenlin/archive/2011/04/06/2007145.html

你可能感兴趣的文章
opencv
查看>>
将相关数据拼成所需JSON数据
查看>>
第一章
查看>>
python全栈-Day 13
查看>>
二十五、侧边栏(charm)
查看>>
C# 部分类: partial关键字的作用(转摘)
查看>>
Bootstrap基础(七):按钮
查看>>
CPoint、CSize、CRect类
查看>>
tftp服务器的搭建和使用
查看>>
python学习01
查看>>
PostgreSQL的case when
查看>>
(转载)虚幻引擎3--【UnrealScript教程】章节一:4.代码的注释
查看>>
如何阅读他人的程序代码
查看>>
Maven使用教程
查看>>
《Java并发编程实战》第八章 线程池的使用 读书笔记
查看>>
Excel中mod函数的使用方法
查看>>
Nginx 添加 PHP 支持
查看>>
stray '\343' in program 编译错误
查看>>
生成网站,如何不生成.pdb文件?
查看>>
互联网项目管理要点
查看>>