2009-05-28 101 views
0

爲網頁和Web服務保留NHibernate ISessionFactory最簡單的方法是什麼?爲網頁和Web服務保留NHibernate ISessionFactory最簡單的方法是什麼?

我會進入Rhino Commons和Windsor這個和那個稍後。我正在尋找基本概念。

這是正確的嗎?

我一直在試圖找到如何儘可能簡單地處理ISessionFactory的指導。我還在尋找一個可以在網頁和Web服務中使用的解決方案。我見過的例子涉及到網頁,從不涉及Web服務的主題。他們首先構建一個創建ISessionFactory的Httpmodule並將其存儲在一個靜態變量中(例如,Jeffery Palermo的HybridSessionBuilder(jeffreypalermo.com/blog/use-this-nhibernate-wrapper-to-keep-your-repository-classes-simple/) )或者在NHibernate的夏天(www.summerofnhibernate.com請參閱Session 13中的StaticSessionManager)我也注意到,儘管ISessionFactory實現了IDisposable,但似乎沒有人會處理它,我想他們只是讓垃圾收集器處理如果IIS被回收或網站變得空閒,會發生這種情況

如果所有這些都是真的,最簡單的事情就是創建一些具有靜態變量的類,該類用於存儲ISessionFactory,這個類將被實例化並被網頁和web服務使用,每次類被實例化時,我都會檢查以確保靜態ISessionFactory變量不爲空。如果它爲空,我重新創建它。因此,我通過在web應用程序中創建一個類的實例來保持ISessionFactory的活動狀態,無論是Web頁面還是Web服務。 ISessionFactory在靜態變量中的事實意味着它由類的每個實例共享。由於會話工廠是線程安全的,這是可以的。只要我不分享ISESSIONS,我就是金。當沒有人擁有這個公共類的實例時,靜態變量不再被引用,並且垃圾回收會破壞ISessionFactory。

這是保持ISessionFactory存活的基本原理嗎?

回答

4

我認爲你有它主要想通了。

沒有人處理會議工廠的原因是,一般來說,你真的不想。構建會話工廠是一項非常昂貴的操作,可能需要很長時間,所以您希望儘可能長時間保持它。 .NET運行庫實際上會創建一個HttpApplication的池,並可以隨意創建/處理它們。因此,如果您可以將會話工廠存儲在應用程序之外,則在AppDomain範圍內,這是可取的,因爲工廠將持續到域被回收爲止。將會話工廠聲明爲靜態會實現這一點,所以這就是爲什麼這樣做的原因;看到MSDN docs on static classes:

靜態構造函數只調用 一次,一個靜態類在內存中保留 在其中您 程序駐留在 應用領域的壽命。

所以,如果你把會話工廠容器靜,從來沒有明確處理它,它會留在內存中,直到AppDomain被回收,最大化工廠實例的實用性和應用程序的性能。

相關問題