2011-07-22 49 views
22

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

周圍有太多不同的文章和意見,我不知道要採取什麼樣的路徑。例如,Take this lengthy article。它給出了Query對象的一個​​例子,但是每個具體的存儲庫在其構造函數中接受一個ISession。在我的BL(業務層)中,我應該關心NH會話?

  1. 創建一堆存儲庫,每個存儲庫都有一堆特定的方法?
    顯然,這是太多的工作,因爲BL現在「允許」知道NHibernate(Repository is the new Singleton)?

  2. 創建一個通用的存儲庫,但暴露IQueriable<T>和BL使用LINQ
    每一個現在,再有就是它的LINQ到NHibernate的將無法處理查詢(或我需要調整在百次查詢中手動執行一次SQL)。使用自定義回購方法很容易,但依靠LINQ的代碼幾乎不可能。只是因爲LINQ在某些情況下被破解,這是無稽之談。

  3. 查詢對象?
    QueryOver也是NH特定的,這意味着BL再次意識到DAL實現。

  4. 又一種方法?

很顯然,我需要能夠管理交易地方,也許使用單位 - 的 - 工作彭定康(雖然也有那許多不同的實現左右)。

+0

你在說DDD中的存儲庫嗎? – mathieu

+0

@mathieu:是的。 (我不確定我可能會想到其他什麼樣的存儲庫)。但更一般地說,我正在尋找一種推薦的方式來組織2011年編寫的應用程序,並附帶所有現代工具和模式。我以前用過幾種方法使用過NHibernate,但是我討厭當我需要在我的BL中引用NH特定的類。 NH似乎並不需要抽象化,這似乎越來越普遍。 – doe

+0

@doe - 當然你的NH特定類只是你的域實體?否則你正在尋找大量的財產重複和映射。 –

回答

13

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

1)是的,爲每個聚合根定義一個存儲庫可能是矯枉過正的,但是您可能會發現,檢索該根的數據的方式可能是特定的,您希望能夠在自定義存儲庫中對其進行控制。 Ayende的文章非常具有說服力,並且對典型開發人員「過度架構」解決方案的渴望 - 通常會損害功能。

2)使用LINQ與NHibernate是一個選項,但我會強調,如果你這樣做,你必須讓自己回到使用條件查詢或HQL的能力。在那個階段,你可能會發現自己會拋出許多例外,你會想知道抽象的初始點是什麼。

3)QueryOver是圍繞標準查詢的類型安全包裝,僅憑這一點就能使它們對我更具吸引力。我經常發現自己重新回到了他們提供的絕對控制的標準 - 後備經常是我必須使用「魔術弦」。這實質上將使NHibernate成爲您的數據訪問抽象。實際上,對於大多數「存儲庫」來說,這會是一個更好的抽象,因爲它們大多數只是提供CRUD方法......存儲庫應該能夠處理查詢規範(確切地說,QueryOver的工作方式)。

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

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

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

+0

評論時你1337獎章:) 6,907 s13 b37我害怕+1,因爲它可能會破壞效果 – Shagglez

2

該網站似乎是現在的下來,但我真的很喜歡鮑勃·克雷文的做法,並用它在幾個大的項目:

http://blog.bobcravens.com/2010/06/the-repository-pattern-with-linq-to-fluent-nhibernate-and-mysql/ 編輯:Google cache version of the link

他使用泛型和數據訪問的UOW模式。

是的,當你需要回退SQL時,它會帶來輕微的痛苦,但我使用了一個可以抽象出來的數據服務層。即數據服務層儘可能使用通用dao(90%的時間),並在其他地方使用vanilla SQL /其他框架。