2009-12-29 6 views
12

Pro:Vor- und Nachteile von DDD-Repositorys

  • Repositorys verstecken komplexe Abfragen.
  • Repository-Methoden können als Transaktionsgrenzen verwendet werden.

    • ORM-Frameworks bietet bereits eine Sammlung wie Schnittstelle zu persistenten Objekten, was ist die Absicht von Endlagern:
    • ORM leicht

    Cons verspottet werden. So fügen Repositories dem System zusätzliche Komplexität hinzu.

  • kombinatorische Explosion bei Verwendung von findBy Methoden. Diese Methoden können mit Kriterienobjekten, Abfragen oder Beispielobjekten vermieden werden. Dazu ist kein Repository erforderlich, da ein ORM diese Möglichkeiten zum Suchen von Objekten bereits unterstützt.
  • Da Repositories eine Sammlung von Aggregatwurzeln (im Sinne von DDD) sind, müssen Aggregatwurzeln erstellt und weitergegeben werden, selbst wenn nur ein untergeordnetes Objekt geändert wird.

Fragen:

  • Welche Vor- und Nachteile kennen Sie?
  • Würden Sie die Verwendung von Repositories empfehlen? (Warum oder warum nicht?)
+2

Kontrastierende ORMs mit Repositories sind nicht wirklich sinnvoll - Sie verwenden ORMs, um Repositories zu implementieren, nicht? –

+1

Keine definitive Antwort. Community Wiki? –

+1

Ihre dritte Con macht keinen Sinn. Wenn Sie ein "untergeordnetes Objekt" eigenständig bearbeiten müssen, sollte es sich um eine aggregierte Wurzel handeln. –

Antwort

8

Der Hauptpunkt eines Repositories (wie beim Prinzip der einfachen Verantwortlichkeit) ist die Zusammenfassung des Konzepts, Objekte mit Identität zu erhalten. Da ich mit DDD vertrauter geworden bin, war es für mich nicht sinnvoll, Repositories so zu betrachten, dass sie sich hauptsächlich auf die Persistenz von Daten konzentrieren, sondern als Fabriken, die Objekte instanziieren und ihre Identität beibehalten.

Wenn Sie ein ORM verwenden, sollten Sie ihre API so begrenzt wie möglich verwenden und sich eine Fassade geben, die möglicherweise domänenspezifisch ist. Also egal, Ihre Domain würde immer noch nur ein Repository sehen. Die Tatsache, dass es ein ORM auf der anderen Seite hat, ist ein "Implementierungsdetail".

7

Ein Repository ist wirklich nur eine Ebene der Abstraktion, wie eine Schnittstelle. Sie verwenden es, wenn Sie Ihre Datenpersistenzimplementierung (d. H. Ihre Datenbank) entkoppeln möchten.

Ich nehme an, wenn Sie Ihre DAL nicht entkoppeln wollen, dann brauchen Sie kein Repository. Aber es gibt viele Vorteile, wie die Testbarkeit. Die kombinatorische Explosion der "Find" -Methoden: In .NET können Sie ein IQueryable anstelle eines IEnumerable zurückgeben und dem aufrufenden Client erlauben, eine Linq-Abfrage darauf auszuführen, anstatt eine Find-Methode zu verwenden.

Dies bietet Flexibilität für den Client, opfert jedoch die Fähigkeit, eine gut definierte, testbare Schnittstelle bereitzustellen. Im Wesentlichen tauschen Sie eine Reihe von Vorteilen für eine andere aus.

+1

+1 bei Rückgabe eines IQueryable aus dem IRepository. Auf diese Weise können Sie Ihre "Find" -Logik in den Service/Root-Layer schreiben und diese Logik testen, indem Sie ein IRepository aufspielen. Wie beim Testen, die Ebene "Repository" ist, wo ich die Grenze zwischen Komponententests und Integrationstests ziehen - ich schreibe Integrationstests für meine Repos und dass sie die richtigen FetchAll() - Datensätze für ein IQueryable zurückgeben, und Unit Tests für alles andere hat tatsächliche Geschäftslogik darin. – eduncan911

+0

Zumindest mit NHibernate müssen Sie beachten, dass es große Unterschiede gibt (Caching, Art und Weise Abfrage ausgeführt wird) zwischen dem Aufrufen von linq .Where (a => a.id == id) und Aufruf von ISession.Load (ID). Es kann hilfreich sein, eine IQueryable-Möglichkeit für den Zugriff auf die Daten zu haben, aber versuchen Sie nicht, alles damit zu machen, denken Sie daran, dass ORMs normalerweise einige Möglichkeiten für erweiterte Abfragen und Operationen bieten. –

8

Das Repository bringt das Domänenmodell in den Fokus, indem es die Datenzugriffsdetails hinter einer Schnittstelle versteckt, die auf der allgegenwärtigen Sprache basiert. Beim Entwerfen von Repositories konzentrieren Sie sich auf Domänenkonzepte und nicht auf Datenzugriff. Aus Sicht von DDD ist die direkte Verwendung der ORM-API gleichbedeutend mit der direkten Verwendung von SQL.

Dies ist, wie Repository wie in der Auftragsabwicklung Anwendung aussehen:

List<Order> myOrders = Orders.FindPending() 

Hinweis, dass es keine Datenzugriffs Begriffe wie ‚Kriterien‘ oder ‚Abfrage‘ sind. Intern kann die 'FindPending'-Methode unter Verwendung von Hibernate-Kriterien oder HQL implementiert werden, was jedoch nichts mit DDD zu tun hat.

Methode Explosion ist ein gültiges Anliegen. Zum Beispiel können Sie am Ende mit mehreren Methoden wie:

Orders.FindPending() 
    Orders.FindPendingByDate(DateTime from, DateTime to) 
    Orders.FindPendingByAmount(Money amount) 
    Orders.FindShipped() 
    Orders.FindShippedOn(DateTime shippedDate) 
    etc 

Dies kann durch Verwendung von Spezifikation Muster verbessert werden. Zum Beispiel können Sie eine Klasse haben

class PendingOrderSpecification{ 
    PendingOrderSpecification WithAmount(Money amount); 
    PendingOrderSpecification WithDate(DateTime from, DateTime to) 
    ... 
} 

Damit Repository wie folgt aussehen:

Orders.FindSatisfying(PendingOrderSpecification pendingSpec) 
Orders.FindSatisfying(ShippedOrderSpecification shippedSpec) 

Eine weitere Option ist separates Repository für Pending und geliefert Aufträge zu haben.

Verwandte Themen