ESFramewor使用技巧(2)-- 在插件中使用NHibernate
??? 好了,我們決定在那個(gè)需要數(shù)據(jù)訪問的插件中使用NHibernate來實(shí)現(xiàn)數(shù)據(jù)層,但是問題來了--當(dāng)我們?yōu)閼?yīng)用程序添加一個(gè)默認(rèn)的App.Config配置文件時(shí),在應(yīng)用程序啟動(dòng)的時(shí)候NHibernate會(huì)自動(dòng)去解析這個(gè)文件的相關(guān)配置,而與應(yīng)用程序不一樣的是,我們也可以為插件添加一個(gè)App.Config配置文件,但是FS在加載這個(gè)插件的時(shí)候,NHibernate不會(huì)去觸碰這個(gè)插件對(duì)應(yīng)的App.Config,這樣NHibernate就無法自動(dòng)完成配置。所以,我們必須手動(dòng)的解決這個(gè)問題。
??? 幸好,NHibernate.Cfg.Configuration的SetProperties()方法可以允許我們將配置內(nèi)容添加到NHibernate中。既然,插件的App.Config不起作用,所以干脆我們用一個(gè)自定義的配置文件好了,其中加入Nhibernate配置:
<?xml?version="1.0"?encoding="utf-8"??>
<configuration>
??<ESFrameworke>
????<DataBaseType>Oracle</DataBaseType>
??</ESFrameworke>
??<nhibernate>
????<add?key="hibernate.connection.provider"?value="NHibernate.Connection.DriverConnectionProvider"?/>
????<add?key="hibernate.connection.driver_class"?value="NHibernate.Driver.OracleClientDriver"?/>
????<add?key="hibernate.connection.connection_string"?value="user?id=jjaj;data?source=ORCL;password=gsaj"?/>
????<add?key="hibernate.connection.isolation"?value="ReadCommitted"/>
????<add?key="hibernate.dialect"?value="NHibernate.Dialect.Oracle9Dialect"?/>
??</nhibernate>
</configuration>
????配置文件添加之后,我們需要自己手動(dòng)解析它,使用XPath可以非常容易獲取配置文件中的Nhibernate配置部分:
??????? private?static?IDictionary?GetNHibernageCfgs()????????{????????????????
????????????string?xPath?=?string.Format("/configuration/nhibernate/add")?;
????????????XmlNodeList?list?=?XmlDoc.SelectNodes(xPath)?;
????????????IDictionary?dic?=?new?Hashtable()?;
????????????foreach(XmlNode?node?in?list)
????????????{
????????????????dic.Add(node.Attributes.Item(0).InnerText?,node.Attributes.Item(1).InnerText)?;
????????????}
????????????return?dic?;????????????
????????}
????當(dāng)插件被加載的時(shí)候的時(shí)候,插件讀取這個(gè)配置并初始化NHibernate的SessionFactory。但是如何切入插件加載的時(shí)刻了?你一定還記得,插件IAddin接口中的OnLoading方法--就是它了,在其中加入類似下面的代碼:
??????????????? IDictionary?dic???=?GetNHibernageCfgs()?;????????????????Configuration?config?=?new?Configuration();
????????????????config.SetProperties(dic)?;????????????????????????
????????????????config?=??config.AddAssembly("BusinessManagerAddin")?;
????????????????ISessionFactory?factory??=?config.BuildSessionFactory();????
??? 本文解決的只是一個(gè)簡(jiǎn)單的在Dll(插件也是Dll)中進(jìn)行NHibernate配置的問題,但是本文更是為了說明一種思想,那就是,在最小的范圍內(nèi)解決問題(如果可以的話),而不是將問題蔓延到更大的范圍。上面所說的插件中的NHibernate配置、初始化完全可以在FS中進(jìn)行,但是如果這樣做,不僅使得FS難于理解(因?yàn)镕S根本不會(huì)使用這個(gè)配置的SessionFactory),而且FS還需要將SessionFactory引用通過某種方式傳遞到插件中,這違反插件“自治”原則,使得FS不再單純,而且與插件的關(guān)系也將日趨復(fù)雜。
附錄(2006.06.07):如何使用CodeSmith協(xié)助NHibernate實(shí)體類與.hbm.xml文件自動(dòng)生成
??? 今天重裝機(jī)后,重裝了CodeSmith,結(jié)果忘記了如何讓CodeSmith協(xié)助NHibernate,摸索了一會(huì)才搞定,現(xiàn)記錄下來作以后參考。
(1)CodeSmith使用 V2.5
(2)將NHibernateTemplate整個(gè)文件夾放到C:\Program Files\CodeSmith\v2.5\Samples下。
(3)提供對(duì)Oracle的支持。用VS2003打開OracleNativeSchemaProvider項(xiàng)目,項(xiàng)目需要引用SchemaExplorer.dll,可在C:\Program Files\CodeSmith\v2.5下找到該文件。重新編譯后,將編譯生成的SchemaExplorer.OracleNativeSchemaProvider.dll和SchemaExplorer.OracleNativeSchemaProvider.dll.config文件拷貝C:\Program Files\CodeSmith\v2.5下,重新打開CodeSmith可。
(4)NHibernate配置示例:
?????????<section?name="nhibernate"?type="System.Configuration.NameValueSectionHandler,?System,?Version=1.0.5000.0,Culture=neutral,?PublicKeyToken=b77a5c561934e089"?/>????????????
????</configSections>????? ??? <nhibernate>
????????<add?key="hibernate.connection.provider"?value="NHibernate.Connection.DriverConnectionProvider"?/>
????????<add?key="hibernate.connection.driver_class"?value="NHibernate.Driver.OracleClientDriver"?/>
????????<add?key="hibernate.connection.connection_string"?value="user?id=XTGL;data?source=ORCL;password=GSGL"?/>
????????<add?key="hibernate.connection.isolation"?value="ReadCommitted"/>
????????<add?key="hibernate.dialect"?value="NHibernate.Dialect.Oracle9Dialect"?/>
????</nhibernate>
(5)使用SessionQuicker操作NHibernate數(shù)據(jù)層。
????
???
?轉(zhuǎn)到??:ESFramework 可復(fù)用的通信框架(序)?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/zhuweisky/archive/2006/04/25/384302.html
總結(jié)
以上是生活随笔為你收集整理的ESFramewor使用技巧(2)-- 在插件中使用NHibernate的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET2.0 ObjectDat
- 下一篇: 北京首个工作的失误