Fluent NHibernate之旅
ORM大家都非常熟悉了吧,我相信也有很多朋友正在用自己或者一些公開(kāi)的框架,而最常用而且強(qiáng)大的,非Hibernate了(Net中為NHibernate),網(wǎng)上的文檔非常多,不過(guò)在博客園中,介紹NHibernate的非常少,李哥的NHibernate系列(NHibernate之旅)不失為一個(gè)經(jīng)典,對(duì)于新手的我們,需要完全掌握還需要很長(zhǎng)一段路,對(duì)于新手來(lái)說(shuō),最初的配置是非常頭大的一件事情,好在老趙推薦一個(gè)開(kāi)源的框架Fluent NHibernate,有了它,我們可以完全脫離配置文件,不過(guò)博客園中介紹Fluent NHibernate的文章非常少,而且官方文檔也還沒(méi)有完全,所以對(duì)于我來(lái)說(shuō)也就一點(diǎn)一點(diǎn)摸索起來(lái),這也激起了我寫(xiě)這個(gè)筆記的欲望,廢話不說(shuō)了,下面就介紹Fluent NHibernate,大家也一起來(lái)體驗(yàn)一下Fluent Nhibernate的快感吧。
本篇內(nèi)容:
1、初識(shí)Fluent NHibernate(簡(jiǎn)稱Fluent)
2、使用NHibernate和Fluent創(chuàng)建ISessionFactory
3、傳統(tǒng)方式和Fluent的對(duì)比。
4、靈活的Fluent
?
一、初識(shí)Fluent NHibernate(簡(jiǎn)稱Fluent)
Fluent NHibernate offers an alternative to NHibernate's standard XML mapping files. Rather than writing XML documents (.hbm.xml files), Fluent NHibernate lets you write mappings in strongly typed C# code. This allows for easy refactoring, improved readability and more concise code.
這是官方的說(shuō)明,大體的話也就是用編程的方式進(jìn)行配置,讓你能更好的理解,不需要編寫(xiě)復(fù)雜的映射文件,它能完全替換NHibernate的映射文件,讓你在映射的時(shí)候能使用C#的強(qiáng)類型方式。
在開(kāi)始之前,我們先下載它的Dll,當(dāng)然你也可以下載它的源代碼進(jìn)行修改和學(xué)習(xí)。
下載地址:http://fluentnhibernate.org/
?
?
二、使用NHibernate和Fluent創(chuàng)建ISessionFactory
準(zhǔn)備工作:
1、下載Fluent類庫(kù),其中已經(jīng)包含了NHibernate最新版本。
2、下載NHibernate類庫(kù),雖然Fluent已經(jīng)有了最新版本,但我們還需要Proxy的Dll,這里我們使用NHibernate.ByteCode.Castle這個(gè)程序集。
3、建立一個(gè)空數(shù)據(jù)庫(kù)(我們使用MSSql2005),數(shù)據(jù)庫(kù)名為:MyNHibernate,這個(gè)數(shù)據(jù)庫(kù)為信任連接。
在NHibernate中,ISession是操作數(shù)據(jù)的核心,我們需要通過(guò)SessionFactory來(lái)建造ISession來(lái)進(jìn)行數(shù)據(jù)的交互。SessionFactory中反映了數(shù)據(jù)庫(kù)映射關(guān)系,我們來(lái)看下配置:
<hibernate-configuration?xmlns="urn:nhibernate-configuration-2.2">
????<session-factory>
??????<property?name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
??????<property?name="connection.connection_string">
????????Server=(local);initial?catalog=MyNHibernate;Integrated?Security=SSPI
??????</property>
??????<property?name="connection.isolation">ReadCommitted</property>
??????<property?name="proxyfactory.factory_class">
????????NHibernate.ByteCode.Castle.ProxyFactoryFactory,?NHibernate.ByteCode.Castle
??????</property>
????</session-factory>
??</hibernate-configuration>大體的意思我相信大家都懂,數(shù)據(jù)庫(kù)類型和數(shù)據(jù)庫(kù)的配置,還有一些NHibernate所需的配置,這里的proxyfactory.factory_class是2.1新加入的,至于用處還不是很了解,大家可以看下李大哥的“NHibernate2.1新特性之Tuplizers”。下面我們?cè)诖a中創(chuàng)建一個(gè)SessionFactory,NHibernate建議我們?cè)谝粋€(gè)應(yīng)用程序中使用一個(gè)數(shù)據(jù)庫(kù)一個(gè)SessionFactory,這里我們用單數(shù)據(jù)庫(kù),代碼如下: ?1????????public?static?ISessionFactory?GetCurrentFactory()
?2????????{
?3????????????if?(sessionFactory?==?null)
?4????????????{
?5????????????????sessionFactory?=?CreateSessionFactory();
?6????????????}
?7
?8????????????return?sessionFactory;
?9????????}
10
11????????private?static?ISessionFactory?CreateSessionFactory()
12????????{
13????????????return?new?Configuration().Configure().BuildSessionFactory();
14????????}
15
16????????private?static?ISessionFactory?sessionFactory
17????????{
18????????????get;
19????????????set;
20????????}
傳統(tǒng)的方式其實(shí)已經(jīng)非常靈活和簡(jiǎn)單了,但配置文件真的有點(diǎn)頭大,那么多的屬性,還有很多特性(Attribute),接下來(lái)我們來(lái)看下Fluent折疊代碼
使用Fluent我們不需要再進(jìn)行配置,我們可以完全拋開(kāi)xml文檔,前面說(shuō)過(guò)Fluent是對(duì)Mapping的一個(gè)代碼化,Mapping的一切功能,我們都能通過(guò)Fluent進(jìn)行配置。
因?yàn)镕luent是基于NHibernate的,它只實(shí)現(xiàn)了NHibernate的Mapping功能,其他功能還不能代替,所以我們的項(xiàng)目中要同時(shí)引入NHibernate和FluentNHibernate兩個(gè)類庫(kù)。代碼如下:
?1????????public?static?ISessionFactory?GetCurrentFactory()?2????????{
?3????????????if?(sessionFactory?==?null)
?4????????????{
?5????????????????sessionFactory?=?CreateSessionFactory();
?6????????????}
?7
?8????????????return?sessionFactory;
?9????????}
10
11????????private?static?ISessionFactory?CreateSessionFactory()
12????????{
13????????????return?Fluently.Configure()
14????????????????.Database(
15????????????????????FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2005
16????????????????????????.ConnectionString(s?=>?s.Server(".")
17????????????????????????????????.Database("MyNHibernate")
18????????????????????????????????.TrustedConnection())
19????????????????).BuildSessionFactory();
20????????}
21??????????????private?static?ISessionFactory?sessionFactory
22????????{
23????????????get;
24????????????set;
25????????}
這樣就可以了,我們完全拋開(kāi)了配置,簡(jiǎn)單的一些代碼,已經(jīng)完成了SessionFactory的配置工作,或許你還有一些配置,在后面的文章中會(huì)繼續(xù)為您講解。折疊代碼
兩種方式的創(chuàng)建寫(xiě)好了,因?yàn)槭菧y(cè)試,所以寫(xiě)的比較亂,下面我們寫(xiě)一個(gè)測(cè)試代碼,只需要測(cè)試一個(gè)方法即可。代碼如下:
?2public?void?NHibernateFactory()
?3{
?4??? var?factory?=?TradSessionFactory.GetCurrentFactory();
?5}
?6[TestMethod]
?7public?void?FluentFactory()
?8{
?9??? var?factory?=?FluentSessionFactory.GetCurrentFactory();
10}
11
運(yùn)行一下,結(jié)果如下:
如果數(shù)據(jù)庫(kù)配置是正確的話,你會(huì)看到如上的結(jié)果。
三、傳統(tǒng)方式和Fluent的對(duì)比
???? 上面的演示相信大家都能看明白,兩者之間的對(duì)比也比較明顯的顯露出來(lái),傳統(tǒng)的方式我們只需要編寫(xiě)正確的配置文件,相對(duì)比較靈活,一些修改的話都可以在配置文件中進(jìn)行更新,比如Mappings,而上面的代碼,Fluent雖然使用代碼的方式進(jìn)行了配置,省去了配置文件,但靈活性卻沒(méi)有傳統(tǒng)方式那么好,修改一些配置的時(shí)候,我們得擴(kuò)充我們的CreateSessionFactory的方法,不過(guò)Fluent更符合人類的思考行為,而且有VS這么強(qiáng)大IDE,在編寫(xiě)代碼的同時(shí),能夠享受強(qiáng)大的智能感知。
???? 兩者之間都各有長(zhǎng)短,或許你還沒(méi)有體會(huì)到Fluent的強(qiáng)大,在日后的Mappings時(shí),你會(huì)慢慢了解為什么他會(huì)叫Fluent。傳統(tǒng)方式對(duì)于一些經(jīng)常使用的程序員來(lái)說(shuō)非常簡(jiǎn)便,加上代碼生成工具,使用起來(lái)也會(huì)游刃有余,但對(duì)于新手來(lái)說(shuō),Fluent絕對(duì)是一個(gè)好幫手。
四、靈活的Fluent
???? 那我們Fluent就沒(méi)有辦法靈活了嗎?當(dāng)然不,Fluent的開(kāi)發(fā)者不僅幫你保留了原有的方式,還可以混合你的配置文件,最有意思的時(shí),你還可以使用它來(lái)學(xué)習(xí)NHibernate,甚至可以使用它來(lái)開(kāi)發(fā)你自己的自動(dòng)代碼生成工具,因?yàn)槲乙矂倢W(xué),先介紹一些簡(jiǎn)單的,至于其他功能,希望大家也能跟我一起學(xué)習(xí),體驗(yàn)Fluent帶來(lái)的快感。
使用NHibernate的配置
???? 也就是你可以按照原先的方式進(jìn)行配置,而讀取呢使用Fluent來(lái)讀取,然后創(chuàng)建SessionFactory,或許你感覺(jué)這不是多余了嘛,那是因?yàn)檫€沒(méi)有講到Mapping,這里我們先介紹一下,如果用Fluent結(jié)合傳統(tǒng)的配置文件,來(lái)創(chuàng)建SessionFactory(后面的代碼會(huì)簡(jiǎn)略,只修改上面其中的創(chuàng)建方法)。
private static ISessionFactory CreateSessionFactory() { return Fluently.Configure(new NHibernate.Cfg.Configuration().Configure()).BuildSessionFactory(); }折疊代碼哈哈,簡(jiǎn)單吧,我們使用了原先的配置文件,然后用Fluent進(jìn)行創(chuàng)建,而且我們可以為配置文件中沒(méi)有的配置進(jìn)行擴(kuò)展。折疊代碼原本打算把Fluent學(xué)習(xí)的方法說(shuō)一下,后來(lái)一看,必須要先說(shuō)Fluent的Mapping才能說(shuō)到這個(gè),所以暫時(shí)先不說(shuō)了,等到下一章映射的部分再一起來(lái)說(shuō)。折疊代碼文章寫(xiě)得很爛,也當(dāng)是筆記吧,NHibernate也是剛剛學(xué),慚愧慚愧,學(xué)的不是很徹底,今后也會(huì)結(jié)合NHibernate的學(xué)習(xí)一起來(lái)說(shuō)。折疊代碼-----------------------------------------------------
??????網(wǎng)名:James.Ying(玄天尊)
??????MSN:x_inday@msn.com
??????經(jīng)驗(yàn):5年電子商務(wù)網(wǎng)站開(kāi)發(fā)
??????目標(biāo):電子商務(wù)平民化。
轉(zhuǎn)載于:https://www.cnblogs.com/aaa6818162/archive/2012/04/10/2439899.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Fluent NHibernate之旅的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mssql性能优化[转](教你写出高质量
- 下一篇: 实现pick和reigister