2009-11-03 14 views
6

Ich bin verwirrt. Dies ist ein Blogeintrag von Ayende Rahien Repository is the new singleton.DDD-Repositories-Muster mit NHibernate

Ich glaube, dass ein Repository nur CRUD-Operationen und keine zusätzlichen Abfragen durchführen sollte, sonst werden Sie mit solchen Methoden auf Ihrem Repository enden.

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

Also meine Frage ist, wo (in welcher Schicht) würde man die Abfragen tun, um Entitäten abrufen?

+0

Zwei nützliche Beiträge zum Thema: von [Jimmy Bogard] (http://www.lostechies.com/blogs/jimmy_bogard /archive/2009/09/02/ddd-repository-implementation-patterns.aspx) und von [Greg Young] (http://codebetter.com/blogs/gregyoung/archive/2009/01/16/ddd-the- generic-repository.aspx). Ich tendiere zu einem hybriden Ansatz: generische Repositories für einfache Aktionen und Abfrageobjekte für kompliziertere. Ich stelle Repositorys normalerweise nicht dem zur Verfügung, was meine Logik (UI, Service) verwendet, sondern biete Funktionalität in einem service-/fassadenähnlichen Muster an, sodass der Dual-Ansatz nicht außerhalb dieser Fassadenebene verfügbar gemacht wird. – tijmenvdk

Antwort

3

Es ist möglich, ein Repository zu schreiben, das CRUD-Standardoperationen hat. Zum Beispiel:

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); 
} 

Expression> ist im Grunde Spezifikation und können Abfragen auf diese Weise kapseln sein. Wenn wir diese Art von Repository haben, dann müssen wir nicht viele spezifische Repositories schreiben.

Alternativer Pfad ist create Abfrage Objekt. Wir könnten die Schnittstelle dieser Abfrage zur Core/Busines-Logikschicht und zur Implementierung zur Dienste/Datenschicht hinzufügen. Auf diese Weise haben wir schön Abfragen wie AllPreferredCustomersQuery benannt. Es ist den Spezifikationen ziemlich ähnlich, aber die Spezifikationen verwenden keine Infrastruktur und daher können wir sie der Core/Business-Logik-Ebene hinzufügen. Abfrage Objekte sind konfigurierbar (zB Limite hinzufügen möchten, holen Strategien, verbindet etc.)