ESFramewor使用技巧(2)-- 在插件中使用NHibernate
??? 好了,我們決定在那個需要數據訪問的插件中使用NHibernate來實現數據層,但是問題來了--當我們為應用程序添加一個默認的App.Config配置文件時,在應用程序啟動的時候NHibernate會自動去解析這個文件的相關配置,而與應用程序不一樣的是,我們也可以為插件添加一個App.Config配置文件,但是FS在加載這個插件的時候,NHibernate不會去觸碰這個插件對應的App.Config,這樣NHibernate就無法自動完成配置。所以,我們必須手動的解決這個問題。
??? 幸好,NHibernate.Cfg.Configuration的SetProperties()方法可以允許我們將配置內容添加到NHibernate中。既然,插件的App.Config不起作用,所以干脆我們用一個自定義的配置文件好了,其中加入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>
????配置文件添加之后,我們需要自己手動解析它,使用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?;????????????
????????}
????當插件被加載的時候的時候,插件讀取這個配置并初始化NHibernate的SessionFactory。但是如何切入插件加載的時刻了?你一定還記得,插件IAddin接口中的OnLoading方法--就是它了,在其中加入類似下面的代碼:
??????????????? IDictionary?dic???=?GetNHibernageCfgs()?;????????????????Configuration?config?=?new?Configuration();
????????????????config.SetProperties(dic)?;????????????????????????
????????????????config?=??config.AddAssembly("BusinessManagerAddin")?;
????????????????ISessionFactory?factory??=?config.BuildSessionFactory();????
??? 本文解決的只是一個簡單的在Dll(插件也是Dll)中進行NHibernate配置的問題,但是本文更是為了說明一種思想,那就是,在最小的范圍內解決問題(如果可以的話),而不是將問題蔓延到更大的范圍。上面所說的插件中的NHibernate配置、初始化完全可以在FS中進行,但是如果這樣做,不僅使得FS難于理解(因為FS根本不會使用這個配置的SessionFactory),而且FS還需要將SessionFactory引用通過某種方式傳遞到插件中,這違反插件“自治”原則,使得FS不再單純,而且與插件的關系也將日趨復雜。
附錄(2006.06.07):如何使用CodeSmith協助NHibernate實體類與.hbm.xml文件自動生成
??? 今天重裝機后,重裝了CodeSmith,結果忘記了如何讓CodeSmith協助NHibernate,摸索了一會才搞定,現記錄下來作以后參考。
(1)CodeSmith使用 V2.5
(2)將NHibernateTemplate整個文件夾放到C:\Program Files\CodeSmith\v2.5\Samples下。
(3)提供對Oracle的支持。用VS2003打開OracleNativeSchemaProvider項目,項目需要引用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數據層。
????
???
?轉到??:ESFramework 可復用的通信框架(序)?
?
?
?
?
轉載于:https://www.cnblogs.com/zhuweisky/archive/2006/04/25/384302.html
總結
以上是生活随笔為你收集整理的ESFramewor使用技巧(2)-- 在插件中使用NHibernate的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET2.0 ObjectDat
- 下一篇: 北京首个工作的失误