2016-07-15 4 views
0

Ich bin neu in CQRS & DDD und für eine Praxis, die ich MS WideWorldImporters Datenbank verwende, im Moment bin ich auf Kaufauftrag Placement-Befehl fest, um die Wahrheit zu sagen, ich weiß nicht, wie es aussehen soll Wie kannst du mich führen? Sollte ich 1 PlaceOrderCommand haben und Handler sollte es verwenden, um PurchaseOrder zu erstellen füllen Sie seine OrderLines und dann speichern. wenn ja, wie Befehl sollte wie folgt aussehen, wenn Domain-Modelle wie folgt aussehen:CQRS & PurchaseOrder AggregateRoot

Beispiel Domain Model:

public class PurchaseOrder : AggregateRoot<int> 
{ 
    private PurchaseOrder(int id, int supplierID, DateTime orderDate, int deliveryMethodID, int contactPersonID) : base(id) 
    { 
     SupplierID = supplierID; 
     OrderDate = orderDate; 
     DeliveryMethodID = deliveryMethodID; 
     ContactPersonID = contactPersonID; 
    } 

    public List<PurchaseOrderLine> PurchaseOrderLines { get; private set; } 
    public int SupplierID { get; private set; } 
    public DateTime OrderDate { get; private set; } 
    public int DeliveryMethodID { get; private set; } 
    public int ContactPersonID { get; private set; } 

    public static PurchaseOrder CreatePurchaseOrder(int supplierID, int deliveryMethodID, int contactPersonID) 
    { 
     return new PurchaseOrder(1, supplierID, DateTime.Now, deliveryMethodID, contactPersonID); 
    } 

    public void AddPurchaseOrderLine(int stockItemID) 
    { 
     PurchaseOrderLines.Add(new PurchaseOrderLine(this.Id, stockItemID)); 
    } 
} 

Beispielbefehl Handler:

public class PurchaseOrdersCommandHandler : 
    ICommandHandler<PlacePurchaseOrder> 
{ 
    private readonly IPurchaseOrderRepository purchaseOrderRepository; 

    public PurchaseOrdersCommandHandler(IPurchaseOrderRepository purchaseOrderRepository) 
    { 
     this.purchaseOrderRepository = purchaseOrderRepository; 
    } 

    public void Handle(PlacePurchaseOrder command) 
    { 
     // TODO: based on command Create Purchase order with its line items and save it to db as a whole 
    } 

} 

Antwort

1

Können Sie nicht nur so etwas tun?

public void Handle(PlacePurchaseOrder command) 
{ 
    var purchaseOrder = PurchaseOrder.CreatePurchaseOrder(command.id, command.upplierID, command.orderDate, command.deliveryMethodID, command.contactPersonID); 
    foreach(int stockItemID in command.OrderLines) 
    { 
     purchaseOrder.AddPurchaseOrderLine(stockItemID) 
    } 
    this.purchaseOrderRepository.Save(purchaseOrder); 
} 
+0

Befehlsargumente können Objektreferenzen sein? – QuietNaN

+0

Wenn es nur eine Liste von Ints ist, sehe ich nicht warum nicht. – tomliversidge

+0

Ich würde versuchen, große verschachtelte Objektdiagramme in Befehlen als eine allgemeine Richtlinie zu vermeiden, aber wenn eine Liste von Ints zur Darstellung der Bestellungszeilenelemente mit dem Geschäftsprozess übereinstimmt, dann denke ich, es ist in Ordnung :) – tomliversidge

Verwandte Themen