NHibernate三層結(jié)構(gòu)應(yīng)用程序開發(fā)_第1頁
NHibernate三層結(jié)構(gòu)應(yīng)用程序開發(fā)_第2頁
NHibernate三層結(jié)構(gòu)應(yīng)用程序開發(fā)_第3頁
NHibernate三層結(jié)構(gòu)應(yīng)用程序開發(fā)_第4頁
NHibernate三層結(jié)構(gòu)應(yīng)用程序開發(fā)_第5頁
已閱讀5頁,還剩49頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、NHibernate三層結(jié)構(gòu)應(yīng)用程序開發(fā)第一步:準(zhǔn)備數(shù)據(jù)表在這里用一個最簡單的例子,有一張關(guān)于的用戶的表,有編號,姓名,密碼,Email地址和最后一次的登錄時間幾個字段。第二步:創(chuàng)建需要被持久化的類在.NET中創(chuàng)建一個NHibernateWebDemo.Model的工程,添加User實(shí)體類。/User.csusingSystem;namespaceNHibernateWebDemo.ModelpublicclassUserpublicUser()privatestringid;privatestringuserName;privatestringpassword;privatestringem

2、ailAddress;privateDateTimelastLogon;publicstringIdgetreturnid;setid=value;publicstringUserNamegetreturnuserName;setuserName=value;publicstringPasswordgetreturnpassword;setpassword=value;publicstringEmailAddressgetreturnemailAddress;setemailAddress=value;publicDateTimeLastLogongetreturnlastLogon;setl

3、astLogon=value;第三步:創(chuàng)建持久化映射文件該文件的命名為,并且與放在同一個目錄里。設(shè)置該文件的生成操作屬性為“嵌入的資源”,這一點(diǎn)要切記。另外,使用編號當(dāng)作主鍵,由用戶輸入,所以在映射文件中用。第四步:進(jìn)行配置文件的設(shè)置在配置文件中,我們要告訴NHibernate所使用的數(shù)據(jù)庫是什么,以及如何連接該數(shù)據(jù)庫。vsectionname=nhibernatetype=System.Configuration.NameVaiueSectionHandler,System,Vfersion=1.0.3300.0,Culture=neutral,PublicKeyToken=b77a5c56

4、1934e089/第五步:編寫數(shù)據(jù)訪問層的公用類在這里,編寫了兩個公用的類,分別進(jìn)行的創(chuàng)建和實(shí)體的操作。在這兩個類中用單件模式,來限制的創(chuàng)建。為了做到與具體的應(yīng)用程序無關(guān),在這里把程序集的名稱作為參數(shù),傳遞給方法。可以把這兩個類單獨(dú)放在一個名為的工程下,這里先把它們放在層中。這兩個類只是個人的一種寫法,大家可以自行去編寫。usingNHibernate.Cfg;usingNHibernate.Tool.hbm2ddl;namespaceNHibernateWebDemo.DALpublicclassSessionFactorypublicSessionFactory()privatestati

5、cISessionFactorysessions;privatestaticConfigurationcfg;staticreadonlyobjectpadlock=newobject();publicstaticISessionOpenSession(stringAssemblyName)if(sessions=null)lock(padlock)if(sessions=null)BuildSessionFactory(AssemblyName);returnsessions.OpenSession();privatestaticvoidBuildSessionFactory(stringA

6、ssemblyName)cfg=newConfiguration();cfg.AddAssembly(AssemblyName);sessions=cfg.BuildSessionFactory();/EntityControl.csusingSystem;usingSystem.Collections;usingNHibernate;namespaceNHibernateWebDemo.DALpublicclassEntityControlprivatestaticEntityControlentity;privatestring_AssemblyName;staticreadonlyobj

7、ectpadlock=newobject();publicstaticEntityControlCreateEntityControl(stringAssemblyName)if(entity=null)lock(padlock)if(entity=null)entity二newEntityControl();entity._AssemblyName=AssemblyName;entity._AssemblyName=AssemblyName;returnentity;publicvoidAddEntity(Objectentity)ISessionsession=SessionFactory

8、.OpenSession(_AssemblyName);ITransactiontransaction=session.BeginTransaction();trysession.Save(entity);transaction.Commit();catch(Exceptionex)transaction.Rollback();throwex;finallysession.Close();session.Close();publicvoidUpdateEntity(Objectentity,Objectkey)ISessionsession=SessionFactory.OpenSession

9、(_AssemblyName);ITransactiontransaction二session.BeginTransaction();trysession.Update(entity,key);transaction.Commit();catch(Exceptionex)transaction.Rollback();throwex;finallysession.Close();publicvoidDeleteEntity(objectentity)ISessionsession=SessionFactory.OpenSession(_AssemblyName);ITransactiontran

10、saction二session.BeginTransaction();trysession.Delete(entity);transaction.Commit();catch(Exceptionex)transaction.Rollback();transaction.Rollback();throwex;finallysession.Close();publicIListGetEntities(stringstrHQL)IListlst;第六步:編寫數(shù)據(jù)訪問層創(chuàng)建一個名為的工程,數(shù)據(jù)訪問層的代碼編寫非常簡單,在創(chuàng)建的實(shí)例時,需要把的程序集名稱作為參數(shù)傳入,可以通過配置文件來避免程序集名稱的硬

11、編碼。control=EntityControl.CreateEntityControl(NHibernateWebDemo.Model);publicvoidAddUser(Useruser)control.AddEntity(user);publicvoidUpdateUser(Useruser,stringId)control.UpdateEntity(user,user.Id);第七步:編寫業(yè)務(wù)邏輯層建立工程,為了簡單期間,在業(yè)務(wù)邏輯層中我沒有做任何的業(yè)務(wù)檢測。UserDALdal=newUserDAL();dal.AddUser(user);publicvoidUpdateUser(

12、Useruser,stringId)UserDALdal=newUserDAL();dal.UpdateUser(user,Id);publicvoidDeleletUser(Useruser)第八步:實(shí)現(xiàn)用戶界面用戶界面很簡單,這里就不給出代碼了,完成后的用戶界面:完整代碼下載:什么是NHibernate是一個基于的針對關(guān)系型數(shù)據(jù)庫的對象持久化類庫。來源于非常優(yōu)秀的基于的關(guān)系型持久化工具。從數(shù)據(jù)庫底層來持久化你的對象到關(guān)系型數(shù)據(jù)庫。為你處理這些,遠(yuǎn)勝于你不得不寫去從數(shù)據(jù)庫存取對象。你的代碼僅僅和對象關(guān)聯(lián),自動產(chǎn)生語句,并確保對象提交到正確的表和字段中去。為什么寫這個任何熟悉的人會發(fā)現(xiàn)這篇文章

13、和非常相近。這里的內(nèi)容正是基于他的指南,因此所有的感謝都應(yīng)該給與他。的文檔并非每處都和的文檔一致。然而,項目的相似應(yīng)該能使讀者通過讀的文檔來很好的理解如何工作。這篇文章意在讓你盡可能快的開始使用。它將介紹如何持久化一個簡單的對象到一張表里。想得到更多的復(fù)雜的例子,可以參考測試及附帶代碼。開發(fā)的過程未來將會提供一些工具幫助你自動產(chǎn)生文件(現(xiàn)在還是基于代碼)或是通過映射文件產(chǎn)生類(在籌措階段)或是更新來自于一個新開發(fā)者的建議)然而,這里我們的例子是假定一切來自于完全手寫,包括設(shè)置表和類的編寫。我們將進(jìn)行以下步驟。1新建一個將要持久化對象的表構(gòu)建一個需要被持久化的類構(gòu)建一個可以讓知道如何持久化對象屬

14、性的映射文件4構(gòu)建一個讓知道如何連接數(shù)據(jù)庫的配置文件5使用的第一步:寫構(gòu)建表的SQL這里我們將使用的是一個非常簡單的例子。假設(shè)你正在為你的網(wǎng)站開發(fā)一個基本的用戶管理子系統(tǒng)。我們將使用如下的一張User表(假定你已經(jīng)設(shè)置好一個數(shù)據(jù)庫在的例子里我稱它為NHibernate)。LogonlDnvarchar(20)NOTNULLdefaultO,Namenvarchar(40)defaultNULL,Passwordnvarchar(20)defaultNULL,EmailAddressnvarchar(40)defaultNULL,LastLogondatetimedefaultNULL,”“Ko

15、gonIgo我使用的是MSSqlServer2000,但也可以使用任何數(shù)據(jù)庫,只要你有關(guān)于它們的基于.Net數(shù)據(jù)提供驅(qū)動程序。我們將得到一個含有LogonID,Name,Password,Email和LastLogon的表.經(jīng)過以上標(biāo)準(zhǔn)步驟,我們下一步是寫一個.Net類處理一個給定的User對象。第二步:產(chǎn)生一個.Net類文件當(dāng)內(nèi)存中有一堆User對象的時候,我們需要某種對象去保存它們。NHibernate通過對象屬性的反射來工作,因此我們需要添加我們希望持久化的對象屬性。一個可以被NHibernate持久化的類應(yīng)該看起來象下面的樣子:usingSystem;namespaceNHiberna

16、te.Demo.QuickStartpublicclassUserprivatestringid;privatestringuserName;privatestringpassword;privatestringemailAddress;privateDateTimelastLogon;publicUser()publicstringIdgetreturnid;setid=value;publicstringUserNamegetreturnuserName;setuserName=value;publicstringPasswordgetreturnpassword;setpassword=

17、value;getreturnemailAddress;setemailAddress=value;publicDateTimeLastLogongetreturnlastLogon;setlastLogon=value;在上面的例子里,我們的屬性和構(gòu)建函數(shù)是public,但這個對NHibernate不是必要的.它可以使用public,protected,internal或者甚至是用private來持久化數(shù)據(jù)。第三步:寫映射文件現(xiàn)在我們有數(shù)據(jù)表和需要去映射它的.Net類。我們需要一種方式去讓NHibernate知道如何從一個映射到另一個。這個任務(wù)依賴于映射文件來完成。最易于管理的辦法是為每一個

18、類寫一個映射文件,如果你命名它是YourObject.hbm.xml并且把它放在和類的同一個目錄里,NHiberante將會使得事情簡單起來。下面是一個User.hbm.xml的例子:hibernatemappingxmlns=urn:nhibernatemapping2.0classname二NHibernate.Examples.QuickStart.User,NHibernate.Examplestable二users/idpropertyname二UserNamecolumn二Nametype=Stringlength二40/propertyname二Passwordtype=Stri

19、nglength二20/propertyname二EmailAddresstype=Stringlength二40/propertyname二LastLogontype=DateTime/讓我們來看看這個文件中讓我們感興趣的某些行。第一個有趣的標(biāo)簽是class。這里我們將映射類型名稱(類名和裝配件)到我們數(shù)據(jù)庫中的User表,這里和Hibernate有一點(diǎn)點(diǎn)的不同。你將不得不告訴NHibernate從何處提取對象。在這個例子里我們從裝配件NHibernate.Examples裝載類NHibernate.Examples.QuickStart.User。NHibernate遵循和.NetFram

20、ework同樣的規(guī)則來加載類型。因此如果你在如何指定類型的方面有些混淆,請參看.NetFrameworkSDK。讓我們先跳過id標(biāo)簽,來討論property標(biāo)簽。簡要看一下,你將發(fā)現(xiàn)NHibernate所要做的工作。name屬性的值正是我們.Net類的屬性,column屬性值將是我們數(shù)據(jù)庫里的字段。type屬性是可選的(如果你不標(biāo)明,NHibernate將利用反射進(jìn)行最佳的推測)。好了,讓我們回到標(biāo)簽id,你可以猜測到這個標(biāo)簽將是映射數(shù)據(jù)庫表的主鍵,的確如此,id標(biāo)簽的組成和我們剛才看的property標(biāo)簽是相似的。我們映射屬性到目標(biāo)數(shù)據(jù)庫的字段。內(nèi)嵌的generator標(biāo)簽告訴NHibern

21、ate如何生成主鍵(它將恰當(dāng)?shù)臑槟闵芍麈I,不管你指定何種類型,但你必須告訴它)。在我們的例子里,我們設(shè)定為assigned,意味著我們對象將自己生成主鍵(畢竟User對象常常需要一個UserID)。如果你執(zhí)意要NHiberante為你生成主鍵,你感興趣于設(shè)定uuid.hex和uuid.string(從文檔中獲取更多信息)提示:如果你使用VisualStudio.Net去編譯的話,請將user.hbm.xml的BuildAction屬性設(shè)置為EmbeddedResource。映射文件將成為裝配件的一部分。更詳細(xì)的細(xì)節(jié)重點(diǎn)將在后面展示。提示:如果你僅僅是改變映射文件,你不能使用build而應(yīng)該R

22、ebuild項目。VisualStudio.Net不會重新編譯有改變的映射文件。第四步:為你的數(shù)據(jù)庫產(chǎn)生一個配置文件我們至今還沒有告訴NHibernate去哪里連接數(shù)據(jù)庫。最直接的辦法是在你的應(yīng)用程序的配置文件里設(shè)置一個NHibernate配置節(jié)。這和在Hibernate里使用屬性文件是等價的。如下配置:configurationconfigSectionssectionname二nhibernatetype二System.Configuration.NameValueSectionHandler,System,Version二1.0.3300.0,Culture二neutral,Public

23、KeyToken二b77a5c561934e089/addkey二vidervalue二NHibernate.Connection.DriverConnectionProvideraddkey二hibernate.dialectSql2addkey二hibernate.connection.driver_classvalue二NHibernate.Driver.SqlClientDriver/configuration上面的例子里用了SqlClient驅(qū)動,在本地連接名稱為NHibernate的數(shù)據(jù)庫,提供用戶名和密碼。那里有一堆屬性你需要調(diào)整來確定如何讓NHibernate來訪問數(shù)據(jù)庫。再次

24、說明,你可以在文檔里獲取更多信息。請注意以上的配置里并沒有涉及到1og4net的配置信息。NHibernate使用log4net來記錄內(nèi)部發(fā)生的一切。在一個應(yīng)用程序產(chǎn)品里,在你特定環(huán)境里,我推薦配置1og4net,并為NHibernate設(shè)置一定的日志級別。第五步:開始展現(xiàn)NHibernate的魔力所有艱苦的工作已經(jīng)完成。你將有以下內(nèi)容User.cs-你需要持久化的C#類User.hbm.xm1你的NHibernate映射文件App.config-對ADO.NET連接的配置信息(如果你愿意,你可以在代碼中實(shí)現(xiàn))。你的數(shù)據(jù)庫里有一張User表。現(xiàn)在可以在你的代碼中恰當(dāng)簡潔的使用NHibernat

25、e。簡化的版本如下創(chuàng)建一個Configuration對象讓Configuration知道你將存儲何種類型的對象為你選擇的數(shù)據(jù)庫創(chuàng)建一個Session對象Load,Save和Query你的對象通過Session的Flush()方法將對象提交給數(shù)據(jù)庫。為了讓你更清晰,我們來看一些代碼。首先,創(chuàng)建一個Configuration對象Configuration對象能夠解析所有.Net對象和后臺數(shù)據(jù)庫中的映射關(guān)系。Configuration對象會搜索裝配件里的任何以hbm.xml結(jié)尾的文件。還有其他方法加載映射文件,但這種方式是最簡單的。下一步,創(chuàng)建一個Session對象對象提供一個到后臺數(shù)據(jù)庫的連接,對象提供一個可以被管理的事務(wù)。接著來Load,Save和Query你的對象現(xiàn)在你可以用使用傳統(tǒng)的.Net方法來操縱對象。你想保存一個新對象到數(shù)據(jù)庫嗎?嘗試下面的方法:正如你所看到的,關(guān)于NHiberante重要的事情是如此簡單。繼續(xù)并且查詢你的數(shù)據(jù)庫,驗證一下User表里的新記錄?,F(xiàn)在重要的事情就是你去操心業(yè)務(wù)對象并在進(jìn)行處理的時候告訴NHibernate就可以了。讓我們來告訴你,當(dāng)你有一

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論