實戰 .Net 數據訪問層 - 6
2024-07-10 13:03:23
供稿:網友
網站運營seo文章大全提供全面的站長運營經驗及seo技術!回到最初的代碼1,作者通過daf的不同調用總共得到了5種不同的data entity對象:datatable,dataset,mycustomer,ilist,dbdatareader,奇怪的是,只有第三次調用才返回真正的data entity對象:mycustomer,這不是和上面所說的data entity façade自相矛盾嗎?
且慢,下面的代碼或許能夠說明一些問題:
代碼5:def如何表現不同數據類型?
// defbase:提供大部分應用程序所需的基本data entity支持,
// 包括collection,ado.net
[serializable()]
public abstract class defbase : ilist, idictionary
{
public static implicit operator dataset(defbase def)
{
return def._dst;
}
public static implicit operator datatable(defbase def)
{
return def._tbl;
}
public static implicit operator dbdatareader(defbase def)
{
return def._rdr;
}
...
}
上面的defbase說明了四個問題:
(1) 對于繼承接口有一定難度的數據類型,如:datatable,dataset,dbdatareader,統統采用implicit operator進行內部數據類型轉換,轉換后的結果即為data entity的實際數據類型,這樣調用比較方便,也容易擴展(例如:本來需要返回datatable,今后可能改為dbdatareader或其它數據類型,此時,data entity / data access的接口都無須改動,調用者也只是改用其它implicit operator進行訪問即可得到想要的數據);
(2) 對于繼承接口非常方便的數據類型,如:ilist,直接繼承接口并實現之(上述的dbdatareader也可以通過繼承idatareader實現,但就目前的ado.net 2.0而言,由于實現idatareader的類幾乎全部從dbdatareader繼承,所以,直接使用implicit operator更為實用)!
(3) 無論上面那種類型,data entity內部都會維護一個指向實際數據成員的對象,該對象反映了數據的真實面目;
(4) 對于只需要暴露基本對象字段的single object,直接使用data entity本身(mycustomer)即可,這種情況,就與我們在o/r mapping中調用data entity時一模一樣了!
對于defbase不能解決的問題,就需要具體的應用程序去處理了。例如:考慮到generic因素,defbase暫不支持xml數據存儲,開發人員就可以在自己的應用程序中建立customized data entity facade,使其支持xml,然后,具體的data entity class就可以直接從customized data entity façade繼承(當然,如果data entity class無須支持xml,也可從defbase繼承)并使用其xml支持功能!
上面代碼3中的mydef / mycustomer就是為了這個目的而構建出來,既使用了framework的功能,又可以在此基礎上進行擴充。
下一段:http://www.csdn.net/develop/read_article.asp?id=27549