2009-09-16 42 views
3

在Web應用程序中使用FluentNHibernate,我創建了一個單身的SessionFactory類具有以下能力:打開/關閉NHibernate的會議

SessionFactory.Instance //returns ISessionFactory 

是否打開/關閉會話作爲普通/最佳實踐如下?

using(ISession session = SessionFactory.Instance.OpenSession()) 
{ 
    using(ITransaction transaction = session.BeginTransaction()) 
    { 
     //some operation 
    } 
} 

上述代碼將存在於給定實體的相應存儲庫類中。

我注意到有一個主題是創建一個HttpModule在應用程序的啓動和停止時打開會話,但我想知道這是情景還是更常見。

UPDATE

今後與HTTP模塊,我也有類似的想法:

隨着庫類,我基本上做以下(配置使用WebSessionContext):

using(ISession session = SessionFactory.Instance.GetCurrentSession()) 
{ 
    using(ITransaction transaction = session.BeginTransaction()) 
    { 
     //some operation 
    } 
} 

回答

9

如果您使用的是Web應用程序,我建議使用HttpModule打開會話並在請求週期內關閉它。我可能會在Application_Start上實例化會話工廠。

對於存儲庫對象,我會通過構造函數將會話傳遞給它。

我個人認爲存儲庫對象沒有足夠的信息來決定如何處理會話。

+0

權上的會話。由於缺乏對WebSessionContext的知識,我最初感到沮喪,但HttpModule(begin/end)功能似乎工作正常。 – 2009-09-16 20:09:04

8

我認爲這將取決於您的通話

  • 的session-per-要求
  • 的session-per-請求與獨立式的對象
  • 的session-per-談話

關於這方面的更多信息look here

這裏是一些實施的鏈接附件

注意會話可以注入到Doa/respository中。

一個完整的架構看看sharp architecture <這是基於最佳實踐,我會reconmend它非常

Summer of Nhibernate EP 13,即將與Asp.Net

+0

非常有用的一套鏈接,謝謝。 – ScottS 2009-09-19 13:15:17