Dot-Net

NHibernate 和儲存庫模式

  • July 22, 2011

使用 Nhibernate + Repository 模式的推薦方法是什麼?

周圍有很多不同的文章和觀點,我不知道該走哪條路。以這篇冗長的文章為例。它給出了 Query 對象的範例,但每個具體的儲存庫都ISession在其建構子中接受一個。在我的 BL(業務層)中,我應該關心哪些 NH 會話?

  1. 創建一堆儲存庫,每個儲存庫都有一堆特定的方法?

顯然,這是太多的工作,因為 BL 現在“允許”了解 NHibernate (Repository 是新的 Singleton)? 2. 創建單個通用儲存庫,但IQueriable<T>在 BL 中公開和使用 LINQ 時不時地

會有一個查詢,LINQ-to-NHibernate 將無法處理(或者我需要在一百個查詢中手動調整一次 SQL)。使用自定義 repo 方法很容易,但使用依賴 LINQ 的程式碼幾乎是不可能的。僅僅因為 LINQ 在某些情況下被破壞而使用兩者都是無稽之談。 3. 查詢對象?

QueryOver也是 NH 特定的,這意味著 BL 再次意識到 DAL 的實現。 4. 另一種方法?

顯然,我需要能夠在某處管理事務,也許使用工作單元模式(儘管周圍也有許多不同的實現)。

在軟體架構的世界中存在許多相互矛盾的觀點,其中許多觀點都非常有根據。

  1. 是的,為每個聚合根定義一個儲存庫可能有點矯枉過正,但您可能會發現為該根檢索數據的方式可能是特定於它的,並且您希望能夠在自定義儲存庫中控制它。Ayende 的文章非常有說服力,並且直擊典型開發人員對“過度架構”解決方案的渴望——通常會損害功能。

  2. 將 LINQ 與 NHibernate 一起使用是一種選擇,但我要強調的是,如果您這樣做,您必須讓自己能夠回退到使用標準查詢或 HQL。在那個階段,您可能會發現自己放入了很多異常,您會想知道抽象的初始點是什麼。

3)QueryOver是標準查詢的類型安全包裝器,僅此一項就使它們對我更具吸引力。我經常發現自己回退到他們提供的絕對控制標準 - 回退通常是我必須使用“魔術字元串”。這實質上將使 NHibernate 成為您的數據訪問抽象。事實上,與大多數“儲存庫”相比,這將是一個更好的抽象,因為它們中的大多數只提供 CRUD 方法……儲存庫應該能夠處理查詢規範(確切地說是如何QueryOver工作的)。

就交易而言 - 這取決於您的框架。實際上,我認為在應用程序中使用工作單元模式並隱藏實現是不現實或有益的(你可以抽象它——但有什麼意義?——你真的要改變你的 ORM 嗎?)

如果您使用的是 ASP.NET,那麼只需(至少)在請求開始時啟動事務,回滾異常並在最後送出。

如果您使用的是 WinForms,那麼您可能需要將每個 UI 任務的生命週期視為您的工作單元。

引用自:https://stackoverflow.com/questions/6789777