2010-09-11 39 views
2

我們正在研究一個大型數據庫的Windows窗體.NET應用程序。目前我們達到了400個表格和業務對象,但這可能是整個應用程序的四分之一。如何在NHibernate中處理大量的映射文件

我現在的問題是,如何處理這個大量的與NHibernate的性能和內存使用情況的映射文件? 業務對象及其映射文件已在不同的程序集中分離。但我相信所有裝配的NH SessionFactory將使用大量內存,性能將受到影響。但是,如果我只用程序集的一個子集構建不同的工廠(也許像是一個領域上下文,它將邏輯部分中的程序集分開),我無法輕鬆地在它們之間交換對象,只能訪問一部分對象。

我們目前的方法是利用上下文屬性來分隔業務對象。業務對象可以是多個上下文的一部分。創建SessionFactory時,給定上下文(一個或多個)的所有映射文件都將合併爲一個大型映射文件,並在運行時編譯爲DLL。然後使用這個新的映射DLL創建Session本身。

但這種方法有一些嚴重的缺陷:

  • 開發商必須考慮業務對象組件之間的裝配引用的照顧;
  • 開發人員必須處理上下文,否則NHibernate將無法找到類的映射;
  • 創建新的映射文件很慢;
  • 開發人員只能訪問當前上下文中的業務對象 - 任何其他訪問都會在運行時導致異常。

也許有一個完全不同的方法?儘管如此,我會很高興。

回答

0

你需要知道的第一件事是你do not need to map everything。在工作中,我有一個類似的例子,我映射了我要處理的對象/表的主要子集,以及其他我通過ad-hoc映射使用它們或通過NHibernate(session.createSqlQuery)執行簡單SQL查詢的其他例子。我映射的那些,其中一些我使用了Automapper,對於更麻煩的那些,定期的Fluent映射(哎呀,我甚至有跨越不同數據庫的NHibernate調用,比如人力資源,財務等)。

就性能而言,我只使用一個會話工廠,而且我個人還沒有看到使用這種方法的任何缺點。當然,Application_Start比普通的ADO.NET應用程序要多,但在此之後,它可以順利通過。按需開始和關閉會話工廠的速度會更慢,因爲它們需要一段時間才能清理乾淨。

+0

感謝您的回答。好的,我已經看過Fluent nHibernate,但臨時映射對我來說是新的。讓我們來看看 – MoJo2600 2010-09-12 16:44:28

0

由於SessionFactory應該是應用程序中的單例,因此內存成本在應用程序中不應該那麼重要。

現在,如果SessionFactory是而不是單身人士,那就是你的問題。

+0

好的......這就是我以前在過去的項目中使用SessionFactory的方式。但是這個上下文系統是在我進入該項目之前創建的。你有更多的信息爲什麼SessionFactory應該是單身人士嗎? – MoJo2600 2010-09-13 09:11:08

+0

因爲創建,不可變和線程安全的代價很高。 – 2010-09-13 11:55:43