2012-07-31 123 views
1

我想設置NHibernate來處理我的會議每個Web請求。當我使用任何存儲庫時,我有一個項目可以初始化我的會話。我想知道每個Web請求管理會話的最佳方式。由於我的架構已解耦,因此我想避免在我的Web項目中打開會話並關閉會話。有沒有一種好的方法來處理這個問題,而不需要Web項目來了解NHibernate的存在?在洋蔥架構管理NHibernate會話

這是我的請求流:

的Web請求 - > ASP.NET MVC 3 - >控制器 - >服務 - >庫(在會議) - > NHibernate的 - >數據庫 - >返回MVC進出。

+0

實現的session-per-請求,但它的會話per-(HTTP)請求......爲什麼你要隱藏,從網絡項目? – dotjoe 2012-07-31 18:02:11

回答

2

看看S#arp Architecture。這是一個包裝NHibernate的框架,併爲您提供了這個功能,以及其他一些功能。您還可以使用Castle Windsor或Ninject等依賴注入容器來執行此操作。 (S#arp使用Castle Windsor)。

如果您想自己做這件事,您需要創建一個HttpModule以在每個Web請求的開始和結束時爲您打開和關閉會話。在請求開始時,模塊將打開一個會話,並將其存儲在HttpContext.Items,這是每個Web請求存儲。處理請求時,您的存儲庫將從此處獲取會話。 (對於一個乾淨的設計,創建一個存儲庫使用的接口ISessionManager,以及一個訪問每個請求存儲的實現,然後它是單元可測試的)。最後,模塊會在請求結束時刷新和關閉會話。我曾經在一個NHibernate項目上做過這樣的工作,雖然它很有教育意義,但它的工作很多。

S#arp是一個很大的框架,它規定了很多應用程序結構。如果你不想走那麼遠的話,看看溫莎城堡,把這些東西乾淨地抽象出來。所有你需要做的(或多或少)是配置容器來實例化存儲庫,每個請求的NHibernate會話對象作爲構造參數。如果你真的想學習如何,建立你自己的HttpModule,但我建議在生產中使用一個框架。

+0

我認爲在這一點上滾動我自己是我最好的選擇。我已經將我的架構基於此:http://blog.tonysneed.com/2011/10/08/peeling-back-the-onion-architecture,但我不確定如何將其插入SessionHelper類I來自該頁面上的來源。我注入我的連接字符串到SessionHelper類btw。我確實認爲HttpModule是要走的路。你能提供更多的幫助嗎? – 2012-08-01 21:40:49

+0

我真的會建議從一開始就使用DI容器。你當然可以建立你自己的HttpModule,或者你選擇的任何方法。如果你之前沒有使用過DI,那麼就有一些學習曲線,但它一點都不壞。 DI是一件非常明智的事情,它可以幫助你將自己編程到一個角落。它使一切鬆耦合,這是洋蔥建築的一個重點。有大量有關使用DI與MVC和NHibernate的博客文章。祝你好運! – 2012-08-02 15:33:22

+0

我有我的整個框架使用Ninject作爲我的DI。使用你的答案,我能夠準確理解我在找什麼。我結束了這個http://ben.onfabrik.com/posts/yet-another-session-per-request-post作爲我爲每個請求設置會話的基礎。我目前正在學習如何讓Ninject注入ActionFilters,這樣我就可以注入我的UnitOfWork實現。再次感謝您的意見和幫助! – 2012-08-02 16:02:27