6

Je mehr ich DDD und Repositories erkunde, desto mehr fühle ich mich stattdessen zu einem Domänen-Service-Ansatz hingezogen.Repository vs Domain Services

Etwas in meinem Bauch mag nicht die Tatsache, dass ein Repository (zumindest in den Beispielen und Artikeln, die ich gelesen habe) nicht einzelne Anweisung atomar ist.

using (var customerRepository = GetCustomerRepository()) 
    { 
     customerRepository.AddCustomerForDelete(someCustomer); 
     customerRepository.SaveChanges(); 
    } 

Es gibt eine Reihe von Dingen, die ich einfach nicht mag. Im Allgemeinen wird das Repository selbst zu einem Problem und muss gepflegt werden (es ist IDisposable und erfordert ein "Commit"). Es scheint nicht so, als würde ich Persistenzwünsche abstrahieren.

Ein viel einfacher Ansatz, der in meinem Bauch zu sitzen scheint besser ist:

GetCustomerService().DeleteCustomer(someCustomer); 

Es Atom ist. Es gibt keine Instanz eines Repositorys, um Änderungen zu verwalten, zu verwerfen oder zu speichern. Und wenn Sie wirklich, wirklich UOW Unterstützung benötigen außerhalb einer einzigen Operation auf aggregierter Wurzel, übernehmen irgendeine Art von Datenumfang Unterstützung (ähnlich einer Transaction):

using(var ds = new DataScope()) 
{ 
    // both of these happen under the same underlying DbConnection or whatever 
    GetCustomerService().DeleteCustomer(someCustomer1); 
    GetCustomerService().DoSomethingElse(someCustomer2); 
} 

In beiden oben, zum Beispiel willen Nehmen wir an, sie befinden sich in einem Business Controller, und der zugrunde liegende Mechanismus (innerhalb der Repository- oder Service-Implementierung) für den Datenzugriff ist ein Entity Framework ObjectContext. Und ein Kunde ist eine aggregierte Wurzel.

Bitte zeigen Sie mir, dass ein Repository-Ansatz besser ist.

Vielen Dank.

+0

+1; stimme nicht zu, aber ich mag die Frage – Marijn

Antwort

2

Ich würde sagen, dass Sie nur naive Beispiele für Repository-Muster gesehen haben. Es gibt nichts, das besagt, dass ein Repository atomare Methoden haben sollte.

Mein Ansatz ist ziemlich identisch mit Ihrem Datascope Ansatz:

using(var uow = UoW.Begin()) 
{ 
    var customerRepo = new CustomerRepository(uow); 
    customerRepo.Remove(someCustomer); 
    uow.Commit(); 
} 

(Mein Ansatz basiert auf Jimmy Nilssons NWorkspace Ideen in seinem Buch Domain Driven Design Anwenden und Mustern)

Auf diese Weise I kann verschiedene Arten von UOWs an meine Repositories übergeben. z.B. ein EF4-basiertes Uow oder eine Linq zu objektbasierter UOW und immer noch dieselben LINQ-Abfragen innerhalb der Repositories.

+0

Es scheint, als ob Sie meine Bedenken mit einem Repository-Ansatz mit der Unit of Work ersetzt haben. – Jeff

+0

Roger adressiert ein echtes Problem mit seiner UOW: "Eine Liste von Objekten, die von einer Geschäftstransaktion betroffen sind, zu verwalten und das Schreiben von Änderungen und die Lösung von Nebenläufigkeitsproblemen zu koordinieren." (Fowler). Es sind die _transactional change_ to _related_ business Objekte, die in den meisten nicht-trivialen Anwendungen angesprochen werden müssen. – Marijn

+0

In einer modernen ORM-unterstützten Datenzugriffsschicht sollten die transaktionalen Änderungen nicht vom ORM selbst koordiniert werden, da in den meisten Fällen ein einzelner Objekt-/Entitätsgraph gespeichert wird? – Jeff

Verwandte Themen