2016-04-29 9 views
0

Ich versuche, mit DDD aufzustehen und es scheint einige Einschränkungen durch den Technologie-Stack in meinem Fall ASP.Net auferlegt, die Sie darüber nachdenken, wie die Dinge funktionieren zusammen. Zum Beispiel lassen Sie uns sagen, dass ich eine reiche Klasse von ShoppingCart erstellt haben und meine ShoppingCart hat zwei Methoden der AddItem (String Sku) und RemoveItem (String Sku). Jetzt habe ich vielleicht eine Menge Logik in diesen beiden Methoden mit vielen meiner Geschäftsregeln Validierung.Wie man Rich Domain Model mit ASP.Net verbindet MVC

Was passiert, wenn ich mein ShoppingCart mithilfe von ASP.Net MVC an die Benutzeroberfläche binden möchte? Idealerweise möchte ich die Methoden AddItem und RemoveItem aufrufen, wenn der Benutzer ein Element auf der Benutzeroberfläche hinzufügt oder entfernt, sodass ich alle Regeln überprüfen kann. Normalerweise binden wir die Benutzeroberfläche jedoch an View Models (POCO-Klassen). Wenn der Benutzer den Einkaufswagen von der Benutzeroberfläche speichert, erhalte ich eine Liste von POCO-Klassen, die ich nun meinem eigentlichen Geschäftsobjekt zuordnen muss. Sollte ich über jedes Element iterieren und es aus vorhandenen Daten verfolgen und AddItem und RemoveItem Methoden jetzt aufrufen?

In diesem Fall muss ich eine Instanz meines Domänenobjekts für diesen Benutzer im Speicher behalten, damit ich Operationen darauf ausführen kann. Selbst dann werde ich einen Großteil der Logik im Controller haben, um zu entscheiden, welche Methoden das Business-Objekt aufrufen soll.

Je mehr ich über diese Zeilen nachdenke, desto verwirrender wird es, weil das Problem nicht auf Winforms passieren würde, wo Sie die entsprechenden Methoden auf dem Domain-Objekt einfach von verschiedenen Ereignissen aus aufrufen können.

Was vermisse ich in diesem ganzen Bild, damit DDD so funktioniert, wie es sollte?

+0

Selbst in Winforms würden Ihre Domain-Entitäten nicht für immer im Speicher bleiben. Sie würden aus der DB geladen werden, wenn sie gebraucht werden, und irgendwann würden sie hoffentlich bestehen bleiben und Müll eingesammelt werden. – guillaume31

Antwort

1

Normalerweise wäre das Hinzufügen und Entfernen von Ressourcen ein HTTP POST-Aufruf. Die Methode auf Ihrem Controller, die diesen Aufruf behandelt, würde also ein Modell der Anforderung erhalten, einen Artikel zum Einkaufswagen hinzuzufügen oder daraus zu entfernen. Zum Beispiel:

public class AddItemToCartRequest 
{ 
    public string CartId { get; set; } 
    public string ItemId { get; set; } 
} 


public class SomeController : Controller 
{ 
    // Reference to some sort of repository/data store for shopping carts 
    private Carts carts; 

    // Reference to some sort of repository/data store for store items. 
    private Items items; 

    public SomeController(Carts carts, Items items) 
    { 
     this.carts = carts; 
     this.items = items; 
    } 

    [HttpPost] 
    public ActionResult AddItem(AddItemToCartRequest request) 
    { 
     var cart = carts.GetCart(request.CartId); 
     var item = items.GetItem(request.ItemId); 

     cart.AddItem(item); 
     carts.Save(cart); 

     // Redirect to action showing the "item added" or whatever. 
    } 
} 

Die Idee ist, dass Sie keine reichen Domänenmodelle hin und her zur Ansicht übergeben. Sie übergeben Klassen, die Modelle der von Ihnen verwendeten Sichten und Anforderungen sind. Bei jeder Anforderung würden Sie Domänenmodellinstanzen aus einem Repository/Datenspeicher abrufen (d. H. Die Felder Einkaufswagen und Artikel im Beispiel). Die Anforderungsdaten müssen nur Bezeichner der abzurufenden Domänenmodellinstanzen angeben.

+0

Ja, ich verstehe diesen Teil, aber um dies zu erreichen, muss ich das ursprüngliche Rich-Domain-Modell im Speicher oder im Ansichtszustand oder in der Sitzung enthalten, um diese Operationen auszuführen, was für mich wie ein Over-Kill aussieht. Genau das ist meine Frage, ist dies der richtige Weg, Dinge mit DDD und ASP.Net MVC zu tun? –

+1

Sie würden den Einkaufswagen und das Objekt bei jeder Anfrage aus einem Datenspeicher/Repository abrufen. Dies wird durch den carts.GetCart (request.CartId) Aufruf veranschaulicht. – lenkan

+0

danke! Ihre Antwort hat Verwirrung aus meinen Gedanken entfernt. –