2009-11-03 125 views
6

我很困惑。這是Ayende Rahien Repository is the new singleton的博客文章。NHibernate存儲庫模式

我相信一個存儲庫只應該做CRUD操作而不是附加查詢,否則你最終會在你的存儲庫中使用這些方法。

  1. FindCustomer(ID)
  2. FindCustomerWithAddresses(ID)
  3. FindCustomerWith ..

所以我的問題是,當(在哪一層)將一個做檢索實體的查詢?

+0

兩個有用的帖子:由[麥博加德](http://www.lostechies.com/blogs/jimmy_bogard /archive/2009/09/02/ddd-repository-implementation-patterns.aspx)和[Greg Young](http://codebetter.com/blogs/gregyoung/archive/2009/01/16/ddd-the-仿製repository.aspx)。我傾向於採用混合方法:簡單操作的通用存儲庫和更復雜操作的查詢對象。我通常不會將存儲庫暴露給使用我的邏輯(UI,服務)的任何內容,但是會以類似於服務/外觀的模式提供功能,所以雙向方法不會暴露在此外觀層之外。 – tijmenvdk 2009-11-03 11:18:37

回答

3

可以編寫具有默認CRUD操作的存儲庫。例如:

public interface IRepository<TEntity> 
{ 
    TEntity FindByIdentity(object identity); 
    TEntity FindBy(Expression<Func<TEntity, bool>> specification); 
    IList<TEntity> FindAll(); 
    IList<TEntity> FindAllBy(Expression<Func<TEntity, bool>> specification); 
    TEntity Save(TEntity saveable); 
    void Delete(TEntity deletable); 
} 

表達式>基本上規格和查詢可以是封裝的方式。如果我們有這樣的存儲庫那麼我們不需要編寫許多特定的存儲庫。

替代路徑是創建查詢對象。我們可以將該查詢的接口添加到核心/業務邏輯層,並將實現添加到服務/數據層。這樣我們可以很好地命名查詢,如AllPreferredCustomersQuery。它與規範非常相似,但規範不使用基礎架構,因此我們可能會將其添加到核心/業務邏輯層。 查詢對象是多個可配置的(例如,可以添加限制,取策略,聯接等)對受試者