我试图使用CQRS & DDD购买域名模式,我知道,我提出在域中的事件,但我不知道在哪里,当我使用命令来注册。事件处理程序是否应该在命令处理程序中注册?或者我误解了一些东西。这是我的过程,你能帮助建模吗?注册事件处理程序在CQRS
完成采购订单命令被给出,比命令处理程序终止订单(从存储库获取订单,更改其状态并保存回数据库),订单终止事件发生在域模型中,比事件处理程序使用标识符订单项,找到供应商的联系信息(可能是电子邮件,甚至外部服务),并通知他有关新的采购订单。
我的命令&命令处理程序是在应用层(事件处理程序也应该在这里?)。 域模型,事件和域图层中的IRepositories。 基础架构层中的存储库实现。
域模型(跳过大多数属性):
public class PurchaseOrder
{
public PurchaseOrder(int purchaseOrderID, int supplierID, bool isOrderFinalized)
{
PurchaseOrderID = purchaseOrderID;
SupplierID = supplierID;
IsOrderFinalized = isOrderFinalized;
}
public int PurchaseOrderID { get; private set; }
public int SupplierID { get; private set; }
public bool IsOrderFinalized { get; private set; }
public static PurchaseOrder CreateNew(int supplierID)
{
return new PurchaseOrder(0, supplierID, false);
}
public void FinalizeOrder()
{
IsOrderFinalized = true;
DomainEvents.Raise(new PurchaseOrderFinalized(PurchaseOrderID));
}
}
FinalizePurchaseOrder命令
public class FinalizePurchaseOrder : ICommand
{
public FinalizePurchaseOrder (int purchaseOrderID)
{
PurchaseOrderID = purchaseOrderID;
}
public int PurchaseOrderID { get; private set; }
}
命令处理程序
public class PurchaseOrdersCommandHandler : ICommandHandler<FinalizePurchaseOrder>
{
public void Handle(FinalizePurchaseOrder command)
{
var purchaseOrder = purchaseOrderRepository.FindByID(command.PurchaseOrderID);
// Should i register event handler here?
// DomainEvents.Register<PurchaseOrderFinalized>(PurchaseOrderFinalizedHandler);
purchaseOrder.FinalizePurchaseOrder();
purchaseOrderRepository.Save(purchaseOrder);
}
}
事件和事件处理程序是这样的:
public class PurchaseOrderFinalized
{
public PurchaseOrderFinalized(int purchaserOrderID)
{
PurchaseOrderID = purchaseOrderID;
}
}
public void PurchaseOrderFinalizedHandler (PurchaseOrderFinalized evt)
{
// TODO: Get PurchaseOrder with its line items, and notify supplier about new order
}
我没有注册的命令处理程序还没有,我只是有域和应用层,我使用了一些测试,单元测试。我读过有关CompositionRoot,所以我在MVC我会在Global.asax中注册指挥事件处理程序的情况下得到了它,我已经看到了例如人们使用NServiceBus注册和发送命令/事件,我是正确,这也是DI容器? – QuietNaN
NServiceBus不是DI容器,而是服务总线。如果你是刚刚开始,我不会用一个DI容器可言,只能把它当纯DI成为一个问题,否则仅仅是另一回事学习 – tomliversidge
明白了,你能不能给我一些链接,我可以拿对其中的命令/事件处理程序被注册代码示例来看看(不使用nservicebus)在CompositionRoot以及他们如何在应用程序中使用。建议使用服务总线吗? – QuietNaN