1

關於使用Repository pattern,UoW pattern有許多討論。我很明白何時以及爲什麼使用Repository pattern。 我們只是說我有幾個聚合根。下一步是什麼?我更喜歡哪種模式/實現?使用比純粹的NHibernate會話更復雜的解決方案的原因是什麼?存儲庫模式,UoW模式,純NHibernate會話

謝謝!

回答

5

庫模式是一種抽象是-imho-沒有必要。它只允許您預定義可在整個系統中多次使用的特定查詢,並提高可讀性。

存儲庫使用工作單元(已由NHibernate的ISession實現);這是我的觀點。

我會做的是在你的項目上爲NHibernate的ISession創建一些擴展方法;它可以是這樣的:

public class ISessionExtensions 
{ 
    public static IEmployeeRepository GetEmployeeRepository(this ISession session) 
    { 
     return new EmployeeRepository(session); 
    } 
} 

public class EmployeeRepository() 
{ 
    internal EmployeeRepository(ISession s) 
    { 
    } 

    public IEnumerable<Employee> GetEmployeesFromDepartment(Department d) 
    { 
     ... 
    } 
} 

然後,在你的代碼,你可以這樣做:

using(ISession s = _sessionFactory.OpenSession()) 
{ 
    var repository = s.GetEmployeeRepository(); 
    ... 
} 
+0

有趣。但是,如果你的應用程序具有合理的大小,那真的會產生很多對nhibernate會話的擴展。這對於可讀性來說如何? Nsesession成爲上帝階級? – Hace 2011-12-27 20:25:58

+0

它爲什麼會產生很多擴展?即使在一個合理規模的系統中,我認爲擴展方法的數量也不會那麼大。除此之外,這並不是說這些擴展方法很複雜。我認爲他們不會讓ISession更像上一堂課。 – 2011-12-27 20:32:01

+0

我以爲你打算爲每個存儲庫創建一個擴展,從而爲每個根集合創建一個擴展; +1表示Isession已經是上帝級了;-) – Hace 2011-12-28 07:17:57

3

存儲庫模式在NHibernate之前。現在我們將存儲庫模式應用於NHibernate之上,這在大多數情況下是不必要的抽象。通用存儲庫作爲NHibernate的抽象層背後的想法是,在某些時候,你可以切換到其他持久化機制,如實體框架。真?那可能嗎?我認爲不是,因爲你會得到很多NH細節,比如緩存,讀取等等。對我來說,簡單的會話使用是可以的。

Here ayende talks about that for a while
And more...