我剛開始學習NHibernate。ASP.NET MVC和NHibernate耦合
在過去的幾個月中,我一直在使用IoC/DI(結構圖)和存儲庫模式,它使我的應用程序更鬆耦合,更容易測試。
當我將持久層切換到NHibernate時,我決定堅持使用我的存儲庫。目前我正在爲每個方法調用創建一個新會話,但這當然意味着我無法從延遲加載中受益。
因此,我希望實現session-per-request,但這樣做會使我的web項目依賴NHibernate(也許這不是件壞事?)。我正計劃將ISession注入到我的存儲庫中,並在beginrequest/endrequest事件中創建和處理會話(請參閱http://ayende.com/Blog/archive/2009/08/05/do-you-need-a-framework.aspx)
這是一種好方法嗎?據推測,如果沒有在我的web項目中引用NHibernate,我不能使用session-per-request?
讓依賴於NHibernate的web項目提示我的下一個(幾個)問題 - 爲什麼即使打擾到存儲庫?由於我的網絡應用程序正在調用與存儲庫對話的服務,爲什麼不放棄存儲庫並在服務內部添加我的NHibernate持久性代碼?最後,是否真的有必要分拆成這麼多項目。 Web項目和基礎設施項目是否足夠?
我意識到自己原來的問題已經改變了一點,但似乎每個人似乎都對這些主題有自己的看法。有些人在NHibernate中使用存儲庫模式,有些人則沒有。有些人將他們的映射文件粘貼到相關的類中,其他人則爲此提供了一個單獨的項目。
非常感謝, 本
我剛開始使用MVC ...老實說,我認爲沒有使用視圖中的延遲加載。我只是確保適當的領域急切加載。如果會話的範圍保持在動作方法中,IMO的事情就簡單多了。 – dotjoe 2010-04-19 14:36:46
它在視圖中可能沒有用處,但在用於構建視圖模型的服務中非常有用,它可以在存儲庫層中節省一些複雜性。一個例子就是一個有很多訂單行的訂單。在顯示列表或訂單的頁面上,我不希望急切地加載每個訂單行。但是,當我鑽入訂單時,我想要OrderLines。使用延遲加載允許我有一個簡單的訂單存儲庫,並且意味着我不必爲加載訂單線而具有其他存儲庫方法。 – 2010-04-19 15:45:43
只是關於會話範圍的說明 - 關於包含由不同操作呈現的多個部分視圖的頁面(例如使用RenderAction)的情況。對於這些保存相同的會話(每個頁面請求)而言,確實比每個動作有一個會話更好? – 2010-04-19 15:49:05