当前位置: 首页 > news >正文

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

在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中的方法( 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;
            }

        }

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


原文地址: http://www.cnblogs.com/firstyi/archive/2007/09/13/891671.html

转载于:https://www.cnblogs.com/zyfking/archive/2009/01/19/1378518.html

相关文章:

  • 强化学习基础:蒙特卡罗和时序差分
  • golang 浮点数 取精度的效率对比
  • OpenCV入门指南 人脸检测 haar分类器
  • MySQL主从延时这么长,要怎么优化?
  • 使用 NPOI 导出数据示例
  • WPF Browser 中如何获取当前路径(临时文件中)?
  • 10+优秀“分步引导”jQuery插件(转)
  • 用processing画李萨如曲线
  • MVC笔记 初识模型(二)
  • android 手机网络接入点名称及WAP、NET模式的区别
  • 金蝶osf接口开发_金蝶云·星辰 | ?小微企业服务成长平台
  • 小程序商店刷榜_怎么注册微信小程序商店
  • 中getname_【136期】你能谈谈Java中 synchronized 对象锁和类锁的区别
  • 加到service中无效_给 COLA 做减法:应用架构中的“弯弯绕设计”
  • set集合 结构体_Swift - 集合(Set)使用详解(附样例)
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Create React App 使用
  • EventListener原理
  • HTTP中的ETag在移动客户端的应用
  • jquery ajax学习笔记
  • oschina
  • session共享问题解决方案
  • Vue小说阅读器(仿追书神器)
  • 将回调地狱按在地上摩擦的Promise
  • 跨域
  • 前端相关框架总和
  • 前端知识点整理(待续)
  • 深度学习入门:10门免费线上课程推荐
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 智能合约开发环境搭建及Hello World合约
  • (0)Nginx 功能特性
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (5)STL算法之复制
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (笔试题)合法字符串
  • (二十四)Flask之flask-session组件
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (五)Python 垃圾回收机制
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (译) 函数式 JS #1:简介
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (原創) 物件導向與老子思想 (OO)
  • (转)ObjectiveC 深浅拷贝学习
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET的数据绑定
  • .NET分布式缓存Memcached从入门到实战
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET下ASPX编程的几个小问题
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [20170705]lsnrctl status LISTENER_SCAN1
  • [Android 数据通信] android cmwap接入点