2016-07-15 3 views
0

Je suis nouveau à CQRS & DDD et pour une pratique j'utilise la base de données MS WideWorldImporters, au moment où je suis bloqué sur la commande de placement de commande, pour dire la vérité je ne sais pas comment il devrait ressembler comme, peux-tu me guider? Devrais-je avoir 1 PlaceOrderCommand et le gestionnaire devrait l'utiliser pour créer PurchaseOrder remplir ses lignes de commande et de sauvegarder. si oui, comment commande devrait ressembler lorsque les modèles de domaine ressemble:CQRS & PurchaseOrder AggregateRoot

Modèle Domaine de l'échantillon:

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)); 
    } 
} 

Commande Sample 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 
    } 

} 

Répondre

1

Pouvez-vous pas seulement faire quelque chose comme ça?

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

les arguments de commande peuvent être des références d'objet? – QuietNaN

+0

Si c'est juste une liste d'ints, je ne vois pas pourquoi pas. – tomliversidge

+0

J'essayerais d'éviter les grands graphiques d'objets imbriqués dans les commandes comme guide général mais si avoir une liste d'ints pour représenter les éléments de campagne du bon de commande correspond au processus métier alors je pense que c'est bien :) – tomliversidge