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;
            }

        }

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

IBatis.Net学习笔记三--两种常用的DAO

在IBatis中我们可以灵活的选择DAO类型,也就是可以在底层选用不同的数据库操作方式。有常规方式、配置文件的方式、Hibernet的方式等:1、常规方式和我们之前的ADO.NET开发较为类似,都是将...
  • gooddasenlin
  • gooddasenlin
  • 2007年09月19日 09:35
  • 1048

iBATIS.net获取运行时sql语句

【本文原创,第一次离首页如此之近。发在候选区攒攒rp,管理员看着不合适可以撤下。】   虽然只在iBatis的世界里小打小闹匆匆数月,却历经数次与领导和同事激辩,再通过不懈努力学习和开发积累,楼猪终...
  • jumtre
  • jumtre
  • 2015年04月20日 23:54
  • 1966

IBatisNet/IBatis动态条件查询XMl映射配置终极解决方案实例

xmlns="http://ibatis.apache.org/mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">     ...
  • zfrong
  • zfrong
  • 2009年02月12日 15:50
  • 5908

MyBatis学习记录(3):Mapper动态代理方式开发DAO

在MyBatis学习记录(2)里,我们用以前经常使用的方式开发DAO,但是这样存在以下问题:原始DAO存在的问题-Dao方法体存在重复代码:每个方法都要通过SqlSessionFactory创建Sql...
  • liqiancao
  • liqiancao
  • 2016年04月15日 18:43
  • 957

IBatisNet配置

配置文件中各节点的说明:    -->                                                     ...
  • zhdd1234
  • zhdd1234
  • 2012年01月10日 22:52
  • 1471

iBatis.Net的核心类

iBatis.NET是我接触Nhibernate之后的第二个ORM框架,我觉得这个框架具有小巧玲珑的特点。如果你想自己开发一个ORM框架的话,我觉得iBatis.net肯定是你必须要熟读的,因为它很简...
  • byondocean
  • byondocean
  • 2010年08月03日 15:24
  • 4336

让iBatisNet同时使用多个数据库

最近作项目,需要使用iBatisNet框架,但是数据库需要同时使用Oracle和Access,在网上查了很多文章都没有相关介绍。经过有一天的摸索(分析源码,测试),终于明白了。 首先,修改dao.co...
  • ocean20
  • ocean20
  • 2009年09月18日 12:41
  • 3673

IBatis.NET连接MySQL数据库配置笔记

Software Version:IBatis.NET 1.6.2.0 MySQL :5.5.10 mysql-connector-net:6.4.3 visual studio 2010 -...
  • KissZjs
  • KissZjs
  • 2011年09月29日 11:03
  • 1749

Ibatis.net防止Sql注入(ibatis.net中$$和##的区别)

转载地址:http://my.oschina.net/u/1266143/blog/171015
  • XuWei_XuWei
  • XuWei_XuWei
  • 2014年06月24日 16:02
  • 1077

Ibatisnet的数据库事务相关与总揽

学习和使用Ibatisnet已经有一段时间了,前段时间也有写过一些与iBatis相关的Blog。也答应过一些朋友要比较全面地介绍一下iBatis,分享自己的学习过程和使用经验,记录一些常见且容易出现的...
  • educast
  • educast
  • 2008年09月07日 16:58
  • 2283
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IBatis.Net学习笔记九--动态选择Dao的设计分析
举报原因:
原因补充:

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