2011-03-26 81 views
3

我在ASP.NET MVC 2,NHibernate和DDD中創建了一個解決方案。我正在使用一個半CQRS類型的模型。ASP.NET MVC 2,Nhibernate和跨層交易

ASP.NET控制器發出驗證傳遞消息到服務層,其更新的域對象的狀態。 我有我的域名調度「事件」,然後這些被「事件處理程序」捕獲,他們對其採取行動。每個這些事件處理程序都可以訪問存儲庫層,並可以提交一個域對象狀態。

事件處理程序也可以直接插入記錄的使用(非NHibernate的)報告信息庫基礎表。事件處理程序也可以執行非數據庫相關操作,如發送電子郵件。

事件處理程序還可以更改對象的狀態,從而創建一組新事件。

我怎樣才能保證一個asp.net請求過程中發生的所有數據庫操作是一個單一的事務中。 我一直在閱讀一些博客(如Kevin WilliamsMatt WrockDavy Brion),並且得到了如何開始在開始和結束請求(再次,我將使用此結構圖),但不知道該交易是如何維持一個Session對象的信息。這是因爲開始和結束請求可能在不同的線程上被調用。

我的存儲庫類在其參數中使用NHibernate ISession。如果我將ISession創建爲Hybrid Scope(StructureMap),將確保在請求期間StructrueMap傳遞的ISession參數保持不變。

請告知,並讓我知道如果我的問題不清楚。

謝謝

的三月

回答

1

可以考慮實施Unit Of Work pattern每個Web請求。工作單元創建NHibernate會話並處理事務。您可以在網絡上找到幾種實施方式,例如thisthis

+0

@Thank你。我正在通過鏈接。 – TheMar 2011-03-27 17:06:34

+0

我接受了這個答案,因爲這兩個鏈接提供了很好的信息,開始在我的UoW上工作 – TheMar 2011-04-07 18:12:47

0

除了創建和COMMITED如果交易你有沒有在你的描述中指定WorldIsRound的答案 - (從你的解釋我假設它應該在服務層的地方)。
我知道有一些工具可以管理你的會話,也可能是你的交易,但在我看來,你想明確地控制你的交易。
我在我的項目中也使用UOW模式,在Begin_Request事件中創建Session對象,然後在需要時使用該對象創建事務。
同樣,這只是我的意見,但我認爲你應該完全控制打開和關閉交易。
好運

+0

謝謝。我希望在請求開始時創建事務並在請求結束時提交。我也在考慮在執行動作開始時執行並在執行結束時進行提交。這樣我就不需要爲基於查詢的數據庫調用啓動事務。 – TheMar 2011-03-27 17:10:37