1. 業(yè)務(wù)實(shí)體層的設計方案選擇
1) 業(yè)務(wù)實(shí)體層的作用
在分層的時(shí)候,我們會(huì )增加一個(gè)實(shí)體層,它的作用如下:
① 將顯示數據和實(shí)際的存儲區域隔離,保證了業(yè)務(wù)的獨立性,提高了可重用性。
② 在業(yè)務(wù)層和表現層之間傳遞數據。(如果沒(méi)有實(shí)體層的話(huà),我們需要把表的每個(gè)字段作為一個(gè)參數在它們之間傳遞,如果修改的話(huà),將需要影響到程序的各個(gè)層)
③ 提供更大的可收縮性。
2) 業(yè)務(wù)實(shí)體層的幾種選擇方案及其優(yōu)缺點(diǎn)。
在.NET環(huán)境下實(shí)現業(yè)務(wù)實(shí)體有下面的幾種選擇:
① DataReader BE 具有最快的讀取速度,用于只讀的場(chǎng)合,不具有OO的概念。
② XML BE 可以與XML Reader和DataSet轉換。缺點(diǎn):性能低,驗證、解析、顯示、排序等都很復雜。
③ Generic DataSet BE 優(yōu)點(diǎn):數據綁定等。缺點(diǎn):客戶(hù)端必須通過(guò)集合來(lái)獲取數據,沒(méi)有類(lèi)型,實(shí)例化開(kāi)銷(xiāo)大,調度性能低。
④ Typed DataSet BE 優(yōu)點(diǎn):由類(lèi)型,可以進(jìn)行類(lèi)型檢查。缺點(diǎn):只能從DataSet繼承,部署不方便,可擴展性差,實(shí)例化開(kāi)銷(xiāo)大,調度性能低。
⑤ Custom BE 優(yōu)點(diǎn):性能調優(yōu),代碼更具有可讀性,用自定義實(shí)體類(lèi)定義一個(gè)良好的接口,將復雜問(wèn)題隱藏在其中。缺點(diǎn):設計開(kāi)發(fā)都很復雜,需要自己去實(shí)現CURD操作,自己去實(shí)現數據綁定,工作量很大。
⑥ O/R Mapping的實(shí)現 它具有自定義類(lèi)的所有優(yōu)點(diǎn),同時(shí)實(shí)現了CRUD,數據綁定等操作。
2. 什么是O/R Mapping?
ORM,即Object-Relationl Mapping,它的作用是在關(guān)系型數據庫和對象之間作一個(gè)映射,這樣,我們在具體的操作數據庫的時(shí)候,就不需要再去和復雜的SQL語(yǔ)句打交道,只要像平時(shí)操作對象一樣操作它就可以了。
讓我們從O/R開(kāi)始。字母O起源于"對象"(Object),而R則來(lái)自于"關(guān)系"(Relational)。幾乎所有的程序里面,都存在對象和關(guān)系數據庫。在業(yè)務(wù)邏輯層和用戶(hù)界面層中,我們是面向對象的。當對象信息發(fā)生變化的時(shí)候,我們需要把對象的信息保存在關(guān)系數據庫中。
當你開(kāi)發(fā)一個(gè)應用程序的時(shí)候(不使用O/R Mapping),你可能會(huì )寫(xiě)不少數據訪(fǎng)問(wèn)層的代碼,用來(lái)從數據庫保存,刪除,讀取對象信息,等等。你在DAL中寫(xiě)了很多的方法來(lái)讀取對象數據,改變狀態(tài)對象等等任務(wù)。而這些代碼寫(xiě)起來(lái)總是重復的。
如果打開(kāi)你最近的程序,看看DAL代碼,你肯定會(huì )看到很多近似的通用的模式。我們以保存對象的方法為例,你傳入一個(gè)對象,為SqlCommand對象添加SqlParameter,把所有屬性和對象對應,設置SqlCommand的CommandText屬性為存儲過(guò)程,然后運行SqlCommand。對于每個(gè)對象都要重復的寫(xiě)這些代碼。
除此之外,還有更好的辦法嗎?有,引入一個(gè)O/R Mapping。實(shí)質(zhì)上,一個(gè)O/R Mapping會(huì )為你生成DAL。與其自己寫(xiě)DAL代碼,不如用O/R Mapping。你用O/R Mapping保存,刪除,讀取對象,O/R Mapping負責生成SQL,你只需要關(guān)心對象就好。
3. 為什么要采用O/R Mapping?
1) 提高學(xué)習開(kāi)發(fā)效率,降低開(kāi)發(fā)成本。
使用ORM可以大大降低學(xué)習和開(kāi)發(fā)成本,現代技術(shù)的發(fā)展,使得我們不得不不停地學(xué)習。我們不僅要學(xué)習面向對象、UML、設計模式等知識,而且還需要學(xué)習Sql Server、ADO.NET、DataSet、DataReader等知識。而在實(shí)際的開(kāi)發(fā)中,真正對客戶(hù)有價(jià)值的是其獨特的業(yè)務(wù)功能,而現在的現狀是我們花費了大量的時(shí)間在編寫(xiě)數據訪(fǎng)問(wèn),CRUD方法,包括后期的Bug查找,維護等也會(huì )花費相當多的時(shí)間在數據處理上。這就是說(shuō),我們在實(shí)際的開(kāi)發(fā)中很多的時(shí)間都被浪費在根本不創(chuàng )造價(jià)值的非業(yè)務(wù)事件上了。
在使用ORM之后,我們將不需要再浪費太多的時(shí)間在A(yíng)DO.NET和Sql語(yǔ)句上。ORM框架已經(jīng)把數據庫轉變成了我們熟悉的對象,我們將只需要了解面向對象開(kāi)發(fā)就可以實(shí)現數據庫應用程序的開(kāi)發(fā)。
2) 簡(jiǎn)化代碼,減少BUG數量。
通過(guò)建立ORM系統,能夠大量減少程序開(kāi)發(fā)代碼,實(shí)現ORM后,開(kāi)發(fā)數據層就比較簡(jiǎn)單,大大減少了出錯機會(huì )。
3) 提高性能
同時(shí)通過(guò)Cache的實(shí)現,能夠對性能進(jìn)行調優(yōu),實(shí)現了ORM區隔了實(shí)際數據存儲和業(yè)務(wù)層之間的關(guān)系,能夠對每一層進(jìn)行單獨跟蹤,增加了性能優(yōu)化的可能。
4) 隔離數據源,可以很方便的轉換數據庫
利用ORM可以將業(yè)務(wù)層與數據存儲隔開(kāi),開(kāi)發(fā)人員不需要關(guān)系實(shí)際存儲的方式,如果我們需要把SQL Server數據庫換成ORACLE數據庫,只需要修改配置文件就可,不需要修改程序。
4. ORM典型工具介紹
由于ORM帶來(lái)的強大便利,已經(jīng)有很多公司或者個(gè)人提供ORM的工具。主要途徑有三個(gè):
① 微軟提供的ObjectSpaces
微軟在VS.NET 2005的Alpha版中就提供了ObjectSpaces,它是在A(yíng)DO.NET數據層上的一層ORM框架。但是,根據微軟網(wǎng)站上提供的消息,ObjectSpaces將不會(huì )和VS.NET2005 一起發(fā)布,它可能會(huì )在2006(7)年和WinFS一起發(fā)布。所以可能無(wú)法在最近的項目中使用。
② 開(kāi)放源碼的免費ORM
雖然.NET領(lǐng)域的開(kāi)發(fā)源碼還遠遠不及Java領(lǐng)域,但是已經(jīng)有好多人把Java領(lǐng)域中的最優(yōu)秀的開(kāi)發(fā)源碼轉移到.NET平臺上來(lái)。這其中包括做單元測試的NUnit,做日志的Log4NET,做AOP的Spring.NET,以及我們要介紹的做ORM框架的NHibernate。
開(kāi)發(fā)源碼的更新都很頻繁,如果你發(fā)現Bug報上去后,他們將會(huì )很快在新發(fā)布的版本中進(jìn)行更新。
開(kāi)發(fā)源碼的作用不僅在于使用,而且他們本身都是非常優(yōu)秀的架構。在購買(mǎi)計算機圖書(shū)的時(shí)候有一句話(huà)叫“No Coding, No Reading”,而開(kāi)放源碼中提供了如何構建架構、如何使用模式的最好范例。
關(guān)于NHibernate現在文檔還不是很多,但是相信隨著(zhù)它的正式版的發(fā)布,會(huì )有越來(lái)越多的官方文章出現,也會(huì )有越來(lái)越多的使用者在網(wǎng)上提供自己的經(jīng)驗。當然,最直接和有效的方法還是去閱讀它的源碼,因為開(kāi)放源碼的內部實(shí)現機制全部透明,所以它的代碼就是最好的文檔。它的代碼結構很清晰,用法更簡(jiǎn)潔,并不是很難閱讀。
③ 其他公司商業(yè)ORM產(chǎn)品
也有一些公司使用是DevExpress的XPO作為ORM框架進(jìn)行開(kāi)發(fā)。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。