2010-11-10 17 views
5

Ich arbeite seit ein paar Monaten mit DDD zusammen und bin auf einige Dinge gestoßen, bei denen ich mir nicht sicher bin.Welches dieser Beispiele steht für die korrekte Verwendung von DDD?

Nehmen Sie das vereinfachte Beispiel des Hinzufügens eines zu einem Order Objekt. Von unserem Controller würden wir eine int über die UI übergeben, die eine Product in der Datenbank darstellt. Welches der folgenden zwei Beispiele ist korrekt (lassen Sie mich wissen, wenn beide falsch liegen)?

Beispiel Eins:

public class OrderController 
{ 
    // Injected Repositories 
    private readonly IProductRepository _productRepository; 

    // Called by UI 
    public void AddProduct(int productId) 
    { 
     Order order = ...; // Persisted Order 
     Product product = _productRepository.GetProduct(productId); 
     order.AddProduct(product); 
    } 
} 

Der Controller-instanziiert das Produkt selbst und fügt sie über die Methode in:

void AddProduct(Product product) 
{ 
    productList.Add(product); 
} 

Beispiel zwei:

public class OrderController 
{ 
    // Injected Repositories 
    private readonly IProductRepository _productRepository; 

    // Called by UI 
    public void AddProduct(int productId) 
    { 
     Order order = ...; // Persisted Order 
     order.AddProduct(productId, _productRepository); 
    } 
} 

Die Order Domänenmodell hat das injizierte Produkt-Repository an sie übergeben und es wird das Produkt und fügt es:

Product AddProduct(int productId, IProductRepository productRepository) 
{ 
    Product product = productRepository.GetProduct(productId); 
    productList.Add(product); 

    return product; 
} 

Ich habe zur Zeit für das erste Beispiel gegangen, weil Ihre Domain Model sollte niemals intern eine Service-Methode aufrufen, jedoch Ich habe in letzter Zeit ein paar Beispiele gesehen, die mein zweites Beispiel verwenden und es sieht ordentlich aus. Es scheint mir, dass Beispiel One Rand an Anämic ist. Beispiel Zwei würde alle Product-Addition-Logik in das Domänenmodell selbst verschieben.

+0

Es scheint, das erste Beispiel würde ein Design in Richtung gierigen Laden von Daten führen, und das zweite in Richtung Lazy Loading. Welche bevorzugen Sie? –

+0

Wie wird Ihre Bestellung gespeichert, nachdem das Produkt zur In-Memory-Liste hinzugefügt wurde? Gibt es etwas magisches passiert (Entschuldigung, ich weiß nicht, C# vielleicht das Auftragsobjekt ist ein Proxy von einem Framework verwaltet?) –

Antwort

2

Zweite ein schrecklich ...

ein Produkt hinzufügen sollte, um zu bestellen, das Repository auf seine Unterschrift nicht haben, da Repository nicht Teil der Domäne ist.

Ich neige dazu, mit dem ersten zu gehen.

+0

Eigentlich Repository ** Schnittstellen ** sind Teil der Domäne. Die konkrete Implementierung ist Teil der Domain Infrastructure: http://dddsample.sourceforge.net/architecture.html – GenericTypeTea

+0

Wenn Sie in den Supermarkt gehen und einen Artikel abholen und zu Ihrem Einkaufswagen hinzufügen, geben Sie ein Repository an? Ja Repository kann als Teil der Infrastrukturdomäne betrachtet werden, aber nicht als Geschäftsdomäne. – Aliostad

+0

Nein, ich bin zu beschäftigt, 'IWheel' zu implementieren. Aber ich mag dein Beispiel :). Ich fand es seltsam. es macht alles aufgeräumter, aber es scheint nicht den Regeln zu entsprechen, so wie ich sie verstanden habe. – GenericTypeTea

1

Kumpel Ja Der erste ist besser ...

Als ob wir in Form von Objekten denken ...

das Produkt der Liste nichts mit dem Produkt-Repository zu tun hat, Hinzufügen, sollte es nimm nur das Produkt.

+0

Produkt ist eigentlich Produkt, es war Tippfehler – Genius

Verwandte Themen