【问题标题】:CQRS & PurchaseOrder AggregateRootCQRS & PurchaseOrder AggregateRoot
【发布时间】:2016-11-18 13:36:04
【问题描述】:

我是 CQRS 和 DDD 的新手,我正在使用 MS WideWorldImporters 数据库进行练习,目前我被困在采购订单放置命令上,说实话我不知道它应该是什么样子,你能引导我? 我应该有 1 个 PlaceOrderCommand 并且处理程序应该使用它来创建 PurchaseOrder 填充它的 OrderLines 然后保存。如果是,当域模型看起来像时,Command 应该是什么样子:

示例域模型:

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

示例命令处理程序:

    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
    }

}

【问题讨论】:

    标签: c# domain-driven-design cqrs domain-model aggregateroot


    【解决方案1】:

    你不能只做这样的事情吗?

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

    【讨论】:

    • 如果它只是一个整数列表,我不明白为什么不这样做。
    • 我会尽量避免在命令中使用大的嵌套对象图作为一般准则,但如果有一个表示采购订单行项目的整数列表与业务流程匹配,那么我认为这很好:)
    • 问题就是这样。我不能有整数列表,下订单时它被放置为一个对象,并且它的订单线不能更改。你所能做的就是 FinalizeOrder 或 CancelOrder 和 orderline 不仅是 stockIDs,它也是数量单价等
    • 您的示例有一个公共方法 AddPurchaseOrderLine,这与您的声明相矛盾,即一旦创建对象就无法更改 OrdeLines。如果是这种情况,通过在构造函数中传递 OrderLines 并使其不可变 以这种方式建模
    • 如果 OrderLines 是对象而不是整数,我可能仍会在我的回答中采用这种方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多