日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
iBATIS.NET中動態(tài)選擇DAO淺析

在iBATIS.NET中可以通過配置文件動態(tài)選擇數(shù)據(jù)庫、動態(tài)選擇Dao對象。

Dao對象也就是操作數(shù)據(jù)庫的類,通過配置文件我們可以選擇DataMapper的方式、ADO的方式、NHibernet的方式以前其他第三方的方式來操作數(shù)據(jù)庫。有利于系統(tǒng)的靈活性和可擴展性。

通過分析動態(tài)選擇Dao的設(shè)計可以加深對iBATIS.NET的理解,更好的使用它,同時也可以借鑒它的好的設(shè)計模式,應(yīng)用到我們的程序開發(fā)中去。

源代碼是最好的分析方式,下面是一些重點代碼和說明:

iBATIS.NET中動態(tài)選擇DAO前提:需要在dao.config中配置:

 
 
 
 
  1.         

iBATIS.NET中動態(tài)選擇DAO在代碼中首先需要進(jìn)行初始化:

 
 
 
 
  1. DomDaoManagerBuilder builder = new DomDaoManagerBuilder();
  2.  builder.Configure("dao.config");

這段代碼實際上做了很多事情,其中就有:將所有的配置的dao的接口和實現(xiàn)注冊到DaoManager類的靜態(tài)屬性中去。也就是在整個應(yīng)用程序或網(wǎng)站啟動時注冊一次就可以了,以后直接從靜態(tài)屬性中取出來使用就可以了。

和dao注冊相關(guān)的代碼如下:

 
 
 
 
  1. dao.Implementation = NodeUtils.GetStringAttribute(prop, "implementation");
  2. dao.Interface = NodeUtils.GetStringAttribute(prop, "interface");
  3. _daoInstance = _daoImplementation.GetConstructor(Type.EmptyTypes).Invoke(null) as IDao;
  4. _proxy = DaoProxy.NewInstance(this);

也就是把配置文件中的interface和implementation讀取,然后生成代理。

iBATIS.NET中動態(tài)選擇DAO最主要的就是最后一句代碼,DaoProxy.NewInstance的實現(xiàn)如下:

 
 
 
 
  1. Castle.DynamicProxy.ProxyGenerator proxyGenerator = new ProxyGenerator();
  2. IInterceptor handler = new DaoProxy(dao);
  3. Type[] interfaces = {dao.DaoInterface, typeof(IDao)};
  4. return (proxyGenerator.CreateProxy(interfaces, handler, dao.DaoInstance) as IDao);

這里我們看到其中使用了Castle.DynamicProxy中的方法(Castle是另外一個開源框架,我和在以后的博客中再說)

DaoProxy實現(xiàn)IInterceptor接口,也就是AOP中常有的攔截機。以后當(dāng)我們通過IDao接口調(diào)用實際的Dao時,都會先通過DaoProxy,由DaoProxy攔截后進(jìn)行一些必要的處理,然后再動態(tài)決定調(diào)用哪一個DAO來進(jìn)行數(shù)據(jù)庫操作。

生成好之后都會放在DaoManager的靜態(tài)屬性中,下次要用的時候直接從里面去就可以了:

 
 
 
 
  1. public IDao this[Type daoInterface]
  2. {
  3.     get
  4.     {
  5.         Dao dao = _daoMap[daoInterface] as Dao;
  6.         if (dao == null) 
  7.         {
  8.             throw new DataException("There is no DAO implementation found for " + daoInterface.Name + " in this context.");
  9.         }
  10.         IDao idao = dao.Proxy;
  11.         return idao;
  12.     }
  13. }

iBATIS.NET中動態(tài)選擇DAO涉及到的主要的類圖如下:

iBATIS.NET中動態(tài)選擇DAO就向你介紹到這里,希望這些對你有所幫助。


網(wǎng)頁題目:iBATIS.NET中動態(tài)選擇DAO淺析
文章位置:http://www.dlmjj.cn/article/cdhpddh.html