2010-04-19 47 views
2

我剛開始學習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中使用存儲庫模式,有些人則沒有。有些人將他們的映射文件粘貼到相關的類中,其他人則爲此提供了一個單獨的項目。

非常感謝, 本

+0

我剛開始使用MVC ...老實說,我認爲沒有使用視圖中的延遲加載。我只是確保適當的領域急切加載。如果會話的範圍保持在動作方法中,IMO的事情就簡單多了。 – dotjoe 2010-04-19 14:36:46

+0

它在視圖中可能沒有用處,但在用於構建視圖模型的服務中非常有用,它可以在存儲庫層中節省一些複雜性。一個例子就是一個有很多訂單行的訂單。在顯示列表或訂單的頁面上,我不希望急切地加載每個訂單行。但是,當我鑽入訂單時,我想要OrderLines。使用延遲加載允許我有一個簡單的訂單存儲庫,並且意味着我不必爲加載訂單線而具有其他存儲庫方法。 – 2010-04-19 15:45:43

+0

只是關於會話範圍的說明 - 關於包含由不同操作呈現的多個部分視圖的頁面(例如使用RenderAction)的情況。對於這些保存相同的會話(每個頁面請求)而言,確實比每個動作有一個會話更好? – 2010-04-19 15:49:05

回答

1

我不會使業務邏輯依賴於NHibernate的。我寫了一個(或多或少簡單)類來創建會話到上下文:

using (TransactionService.CreateTransaction()) 
{ 
    // use repository here 

    // rollback on exception, only commit when reach this last line: 
    TransactionService.Commit(); 
} 

你只是得到一個IDisposable的,你不需要知道會話。

存儲庫獲取API訪問會話。例如:

// example repository implementation 
public Entity Get(Guid id) 
{ 
    return SessionProvider.Session.Get<Entity>(id); 
} 

要實現這一點,我把會議變成一個ThreadStatic變量,這是在CreateTransaction初始化和SessionProvider.Session返回。

+0

@Stefan,你能解釋一下如何在每個請求中使用會話。您如何/在哪裏創建和處理會話? – 2010-04-19 14:07:49

+0

我在'TransactionService.CreateTransaction'中創建會話。在那裏我返回一個實現了'IDisposable'的小類,並在Dispose中調用'TransactionService'(我實際上發送了一個事件,它在創建此對象時由'TransactionService'註冊。)那裏會話被關閉。當你的請求進入時,你使用'TransactionService.CreateTransaction'來打開事務。然後它在那裏。 – 2010-04-19 14:22:00

+0

小心分享您的TransactionService的代碼?沒有冒犯性,但上述代碼並不能真正幫助我。 – 2010-04-19 15:19:27

1

看看S#arp Architecture。它可以滿足您所需的一切,包括如何分離數據層(NHibernate),Web層和業務邏輯。