[原创]Fluent NHibernate之旅
ORM大家都非常熟悉了吧,我相信也有很多朋友正在用自己或者一些公開的框架,而最常用而且強(qiáng)大的,非Hibernate了(Net中為NHibernate),網(wǎng)上的文檔非常多,不過在博客園中,介紹NHibernate的非常少,李哥的NHibernate系列(NHibernate之旅)不失為一個經(jīng)典,對于新手的我們,需要完全掌握還需要很長一段路,對于新手來說,最初的配置是非常頭大的一件事情,好在老趙推薦一個開源的框架Fluent NHibernate,有了它,我們可以完全脫離配置文件,不過博客園中介紹Fluent NHibernate的文章非常少,而且官方文檔也還沒有完全,所以對于我來說也就一點(diǎn)一點(diǎn)摸索起來,這也激起了我寫這個筆記的欲望,廢話不說了,下面就介紹Fluent NHibernate,大家也一起來體驗一下Fluent Nhibernate的快感吧。
本篇內(nèi)容:
1、初識Fluent NHibernate(簡稱Fluent)
2、使用NHibernate和Fluent創(chuàng)建ISessionFactory
3、傳統(tǒng)方式和Fluent的對比。
4、靈活的Fluent
?
一、初識Fluent NHibernate(簡稱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.
這是官方的說明,大體的話也就是用編程的方式進(jìn)行配置,讓你能更好的理解,不需要編寫復(fù)雜的映射文件,它能完全替換NHibernate的映射文件,讓你在映射的時候能使用C#的強(qiáng)類型方式。
在開始之前,我們先下載它的Dll,當(dāng)然你也可以下載它的源代碼進(jìn)行修改和學(xué)習(xí)。
下載地址:http://fluentnhibernate.org/
?
?
二、使用NHibernate和Fluent創(chuàng)建ISessionFactory
準(zhǔn)備工作:
1、下載Fluent類庫,其中已經(jīng)包含了NHibernate最新版本。
2、下載NHibernate類庫,雖然Fluent已經(jīng)有了最新版本,但我們還需要Proxy的Dll,這里我們使用NHibernate.ByteCode.Castle這個程序集。
3、建立一個空數(shù)據(jù)庫(我們使用MSSql2005),數(shù)據(jù)庫名為:MyNHibernate,這個數(shù)據(jù)庫為信任連接。
在NHibernate中,ISession是操作數(shù)據(jù)的核心,我們需要通過SessionFactory來建造ISession來進(jìn)行數(shù)據(jù)的交互。SessionFactory中反映了數(shù)據(jù)庫映射關(guān)系,我們來看下配置:
<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ù)庫類型和數(shù)據(jù)庫的配置,還有一些NHibernate所需的配置,這里的proxyfactory.factory_class是2.1新加入的,至于用處還不是很了解,大家可以看下李大哥的“NHibernate2.1新特性之Tuplizers”。下面我們在代碼中創(chuàng)建一個SessionFactory,NHibernate建議我們在一個應(yīng)用程序中使用一個數(shù)據(jù)庫一個SessionFactory,這里我們用單數(shù)據(jù)庫,代碼如下: ?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)的方式其實已經(jīng)非常靈活和簡單了,但配置文件真的有點(diǎn)頭大,那么多的屬性,還有很多特性(Attribute),接下來我們來看下Fluent
使用Fluent我們不需要再進(jìn)行配置,我們可以完全拋開xml文檔,前面說過Fluent是對Mapping的一個代碼化,Mapping的一切功能,我們都能通過Fluent進(jìn)行配置。
因為Fluent是基于NHibernate的,它只實現(xiàn)了NHibernate的Mapping功能,其他功能還不能代替,所以我們的項目中要同時引入NHibernate和FluentNHibernate兩個類庫。代碼如下:
?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????????}
這樣就可以了,我們完全拋開了配置,簡單的一些代碼,已經(jīng)完成了SessionFactory的配置工作,或許你還有一些配置,在后面的文章中會繼續(xù)為您講解。
兩種方式的創(chuàng)建寫好了,因為是測試,所以寫的比較亂,下面我們寫一個測試代碼,只需要測試一個方法即可。代碼如下:
?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ù)庫配置是正確的話,你會看到如上的結(jié)果。
三、傳統(tǒng)方式和Fluent的對比
???? 上面的演示相信大家都能看明白,兩者之間的對比也比較明顯的顯露出來,傳統(tǒng)的方式我們只需要編寫正確的配置文件,相對比較靈活,一些修改的話都可以在配置文件中進(jìn)行更新,比如Mappings,而上面的代碼,Fluent雖然使用代碼的方式進(jìn)行了配置,省去了配置文件,但靈活性卻沒有傳統(tǒng)方式那么好,修改一些配置的時候,我們得擴(kuò)充我們的CreateSessionFactory的方法,不過Fluent更符合人類的思考行為,而且有VS這么強(qiáng)大IDE,在編寫代碼的同時,能夠享受強(qiáng)大的智能感知。
???? 兩者之間都各有長短,或許你還沒有體會到Fluent的強(qiáng)大,在日后的Mappings時,你會慢慢了解為什么他會叫Fluent。傳統(tǒng)方式對于一些經(jīng)常使用的程序員來說非常簡便,加上代碼生成工具,使用起來也會游刃有余,但對于新手來說,Fluent絕對是一個好幫手。
四、靈活的Fluent
???? 那我們Fluent就沒有辦法靈活了嗎?當(dāng)然不,Fluent的開發(fā)者不僅幫你保留了原有的方式,還可以混合你的配置文件,最有意思的時,你還可以使用它來學(xué)習(xí)NHibernate,甚至可以使用它來開發(fā)你自己的自動代碼生成工具,因為我也剛學(xué),先介紹一些簡單的,至于其他功能,希望大家也能跟我一起學(xué)習(xí),體驗Fluent帶來的快感。
使用NHibernate的配置
???? 也就是你可以按照原先的方式進(jìn)行配置,而讀取呢使用Fluent來讀取,然后創(chuàng)建SessionFactory,或許你感覺這不是多余了嘛,那是因為還沒有講到Mapping,這里我們先介紹一下,如果用Fluent結(jié)合傳統(tǒng)的配置文件,來創(chuàng)建SessionFactory(后面的代碼會簡略,只修改上面其中的創(chuàng)建方法)。
private static ISessionFactory CreateSessionFactory() { return Fluently.Configure(new NHibernate.Cfg.Configuration().Configure()).BuildSessionFactory(); }哈哈,簡單吧,我們使用了原先的配置文件,然后用Fluent進(jìn)行創(chuàng)建,而且我們可以為配置文件中沒有的配置進(jìn)行擴(kuò)展。原本打算把Fluent學(xué)習(xí)的方法說一下,后來一看,必須要先說Fluent的Mapping才能說到這個,所以暫時先不說了,等到下一章映射的部分再一起來說。文章寫得很爛,也當(dāng)是筆記吧,NHibernate也是剛剛學(xué),慚愧慚愧,學(xué)的不是很徹底,今后也會結(jié)合NHibernate的學(xué)習(xí)一起來說。轉(zhuǎn)載于:https://www.cnblogs.com/inday/archive/2009/08/04/Study-Fluent-NHibernate-Start.html
總結(jié)
以上是生活随笔為你收集整理的[原创]Fluent NHibernate之旅的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编程大讲坛、坛坛是佳酿--编程大讲坛:C
- 下一篇: IT业的职业细分