iBATIS.NET中動(dòng)態(tài)選擇DAO淺析
在iBATIS.NET中可以通過(guò)配置文件動(dòng)態(tài)選擇數(shù)據(jù)庫(kù)、動(dòng)態(tài)選擇Dao對(duì)象。
Dao對(duì)象也就是操作數(shù)據(jù)庫(kù)的類,通過(guò)配置文件我們可以選擇DataMapper的方式、ADO的方式、NHibernet的方式以前其他第三方的方式來(lái)操作數(shù)據(jù)庫(kù)。有利于系統(tǒng)的靈活性和可擴(kuò)展性。
通過(guò)分析動(dòng)態(tài)選擇Dao的設(shè)計(jì)可以加深對(duì)iBATIS.NET的理解,更好的使用它,同時(shí)也可以借鑒它的好的設(shè)計(jì)模式,應(yīng)用到我們的程序開(kāi)發(fā)中去。
源代碼是最好的分析方式,下面是一些重點(diǎn)代碼和說(shuō)明:
iBATIS.NET中動(dòng)態(tài)選擇DAO前提:需要在dao.config中配置:
- <daoFactory>
 - <dao interface="GSpring.Dao.Interfaces.IAccountDao, GSpring.Dao" implementation="GSpring.Dao.Implementations.AccountDao, GSpring.Dao"/>
 - </daoFactory>
 
iBATIS.NET中動(dòng)態(tài)選擇DAO在代碼中首先需要進(jìn)行初始化:
- DomDaoManagerBuilder builder = new DomDaoManagerBuilder();
 - builder.Configure("dao.config");
 
這段代碼實(shí)際上做了很多事情,其中就有:將所有的配置的dao的接口和實(shí)現(xiàn)注冊(cè)到DaoManager類的靜態(tài)屬性中去。也就是在整個(gè)應(yīng)用程序或網(wǎng)站啟動(dòng)時(shí)注冊(cè)一次就可以了,以后直接從靜態(tài)屬性中取出來(lái)使用就可以了。
和dao注冊(cè)相關(guān)的代碼如下:
- 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讀取,然后生成代理。
iBATIS.NET中動(dòng)態(tài)選擇DAO最主要的就是最后一句代碼,DaoProxy.NewInstance的實(shí)現(xiàn)如下:
- 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是另外一個(gè)開(kāi)源框架,我和在以后的博客中再說(shuō))
DaoProxy實(shí)現(xiàn)IInterceptor接口,也就是AOP中常有的攔截機(jī)。以后當(dāng)我們通過(guò)IDao接口調(diào)用實(shí)際的Dao時(shí),都會(huì)先通過(guò)DaoProxy,由DaoProxy攔截后進(jìn)行一些必要的處理,然后再動(dòng)態(tài)決定調(diào)用哪一個(gè)DAO來(lái)進(jìn)行數(shù)據(jù)庫(kù)操作。
生成好之后都會(huì)放在DaoManager的靜態(tài)屬性中,下次要用的時(shí)候直接從里面去就可以了:
- 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中動(dòng)態(tài)選擇DAO涉及到的主要的類圖如下:
iBATIS.NET中動(dòng)態(tài)選擇DAO就向你介紹到這里,希望這些對(duì)你有所幫助。
【編輯推薦】
















 
 
 
 
 
 
 