2010-04-09 47 views
12

我想我陷入了分析的癱瘓。請幫忙!在MVVM中使用工作單元設計模式/ NHibernate會話WPF

我目前有

單位在我的情況下,實現一次支持一個NHibernate會話。我當時認爲這很有道理,它隱藏了ViewModel中NHibernate會話的內部運作。

現在,根據奧倫埃尼(Ayende):http://msdn.microsoft.com/en-us/magazine/ee819139.aspx

他說服該NHibernate的會話應該創建/與演示/視圖模型相關聯的視圖被設置時設置的目標對象。他提出了爲什麼你不希望每個Windows應用程序有一個會話的問題,也不希望每個事務都創建/處理一個會話。這不幸的是帶來了一個問題,因爲我的用戶界面很容易在應用中出現10多個視圖/視圖模型。他正在展示使用MVP策略,但他的建議是否轉化爲MVVM?

這是否意味着我應該廢除工作單元並讓viewmodel直接創建NHibernate會話? WPF應用程序一次只能有一個工作會話嗎?如果這是真的,我應該什麼時候創建/處理NHibernate會話?

我還沒有考慮過NHibernate無狀態會話如何適應所有這些!我的大腦會爆炸。請幫忙!

更新:

我發現了犀牛工具工作落實Ayende的單位。我發現他的實施和我所做的實施之間存在顯着差異。他絕對支持多場會議。進一步研究後,我認爲這是最好的,我做到以下幾點:

  • 廢我實施工作
  • 單位辭職,使用NHibernate的ISession的和IStatelessSession直接從視圖模型對象。雖然在我看來這並不理想,但我已經花費了太多的時間在工作單元上,並沒有形成它的目標。在某個時刻應用KISS和YAGNI。至少我能夠安慰Ayende的文章和其他一些人指出,直接使用這些文件是可以的。
  • 如果我真的不想公開ISession,我總是可以使用Castle.ActiveRecord,但我認爲這不是必需的。
  • 我可以重新使用會話工廠代碼,因此工作單元實施不是完全浪費。
  • 重構我的存儲庫以允許注入StatelessSession和Session,如果可用則使用無狀態:否則使用常規會話。

畢竟這一點,那麼我能將每視圖模型和視圖被設置時打開一個會話/無狀態會話的策略,具有視圖模型沖洗/處置會話/無狀態會話。

聽起來像一個計劃?

+0

第一個鏈接死了 – afaolek 2015-11-11 11:20:59

回答

2

您對10個以上的會話進行活動有什麼實際的擔憂?會話是可用於重量級操作的輕量級對象。如果該會議目前沒有做任何事情,那是微不足道的。

+0

我的問題是,我開始編寫存儲庫,然後意識到一個工作單元將添加到存儲庫,因爲我不想向視圖模型公開NHibernate運作(我不是100%然後在Nibernate上銷售),所以我做到了。 現在看來,我的工作單元實現並不好,因爲該特定實現一次只支持一個會話。也許答案在於需要重構Unit Of Work來支持多個會話。 有時我希望我沒有打擾工作單元,並立即使用NHibernate會話。它開始聞起來不好。 – Echiban 2010-04-09 20:22:26

+0

我想在這個時候,我需要指導一個合適的工作單元如何實現。我目前的實施非常接近上面的工作單元鏈接。 – Echiban 2010-04-09 20:28:41

1

使用UnitOfWork會嚴重限制客戶端應用程序,因爲所有延遲加載都會中斷。你失去了NHibernate擅長的部分。你也在設置自己的運行時異常,因爲NHibernate模型中沒有提醒你不要使用這些功能。 我想說Ayendes的建議很好。

+1

解釋爲什麼UnitOfWork(基本上是nH的ISession)打破懶加載? – tofi9 2010-04-09 15:14:13

+0

工作單位,我實施它的方式,一次只允許一個活動會話。根據我閱讀的工作單元文章,這對客戶和網站都有好處,所以我繼續做下去。現在我得出結論,我的工作單位需要重新編寫以支持多次會議。 – Echiban 2010-04-09 20:26:17

+0

@taoufik:一個工作單元是短暫的(並在所有工作完成後殺死會話)。您正在檢索的實體可能比您的UnitOfWork長。任何延遲加載代理都會保留對現在被終止的會話的引用。 如果您嘗試在UnitOfWork外使用任何延遲加載屬性,則會發生運行時異常。 – 2010-04-10 08:10:12

0

就我個人而言,我儘量保持會議儘可能短的時間。主要原因是我們對主聚合根使用悲觀鎖定(我們使用域驅動設計),所以我們想盡快釋放鎖。不要忘記,因爲你使用的是NHibernate客戶端,所以你可以關閉會話,當你打開一個新的會話時,你可以重新連接斷開的實體。

即使在一次有很多窗口/標籤打開的應用程序中,我個人仍然一次只使用一個會話。當我需要爲視圖檢索數據或需要保持更改時,我會打開一個新的視圖。

在我們目前的應用程序中,我們在我們的工作單元中實現了多會話支持,但最終在我們意識到我們沒有任何用處時才結束,它只是使事情複雜化。

3

我知道這個日期不久前,但我一直在網上尋找一個體面的答案3天。 我讀過你提到的兩個博客看看Nhibernate 3.0的食譜,他們也在MVP應用中討論Nhibernate,但是這並不完全適合我的MVVM環境,使用存儲庫和使用Ninject進行IoC。

我發現這個老帖子裏面作爲迄今爲止最有用的頁面: http://www.emidee.net/index.php/2010/08/23/ninject-use-one-database-session-per-view-model

我希望這有助於人誰將在以後出現此問題絆倒。