我試圖使用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