2

我應該如何爲WinForms應用程序提供NHibernate會話工廠和會話?適用於WinForms的NHibernate設計

SessionFactory應該是單身嗎?或者我可以每次創建它?會話和交易如何?

任何幫助,將不勝感激。由於

回答

4

會話工廠應該是一個單身,因爲它是昂貴創建。它是線程安全的,因此使用它不存在線程問題。

我在winforms應用程序中使用了session-per-conversation模式,並發現它運行良好。使用這種模式,您可以使用同一個會話進行一系列屬於一組的操作。正如我所看到的,在Winforms應用程序中的對話可以粗略地映射到應用程序中的GUI操作。

爲每個GUI操作使用新會話有助於保持會話足夠小,以避免第一級緩存中的許多實體出現性能問題,同時避免爲每個操作使用單獨的會話,這也可以導致性能問題。

爲了實現這一點,那麼你處理GUI命令之前創建一個新的會話,並在命令已經處理你處置會話。下面是一個例子,它使用了一個類(PersistenceContext),它在實例化時創建一個會話,並在會話被處置時處置它。然後這個類可以創建使用當前會話的存儲庫。

public void SomeGuiEvent(...) 
{ 
    using (var context = new PersistenceContext()) 
    { 
     ProcessStuff(context); 
    } 
} 

有ofcourse如何實現這個許多其他選項,但無論你選擇來實現它,我可以在WinForms應用程序使用NHibernate時推薦的session-per-會話模式。

2

在堆棧溢出時,這已經被問了幾次。

會話工廠應該是一個單身人士,因爲它們的創建成本很高。

的會話,似乎是對的NHibernate和WinForms「每形成一個會話」的方法粗略的共識。這意味着當您打開訪問數據庫的表單時應打開會話,並在關閉表單時關閉會話。

看看這個問題的答案 - What should be the lifetime of an NHibernate session? - 一些更詳細的描述,以及一些進一步閱讀的好鏈接。