我正在尝试使用CQRS和DDD为购买域建模,我知道我在域中引发事件,但是当我使用命令时我不知道在哪里注册它们。事件处理程序是否应该在命令处理程序中注册?也许我误会了一些东西。这是我的过程,您可以帮助您正确建模吗?
最终确定采购订单给定命令,然后命令处理程序确定订单(从存储库中获取订单,更改其状态并保存回db),订单完成事件在域模型中发生,然后事件处理程序使用ID及其订单项查找此订单,供应商的联系信息(可能是电子邮件,甚至是外部服务),并通知他新的采购订单。
我的命令和命令处理程序在应用程序层中(事件处理程序也应该在这里吗?)。域层中的域模型,事件和IRepository。基础结构层中的存储库实现。
域模型(跳过大多数属性):
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));
}
}
Run Code Online (Sandbox Code Playgroud)
FinalizePurchaseOrder命令
public class FinalizePurchaseOrder : ICommand
{ …Run Code Online (Sandbox Code Playgroud) 我有一个 PurchaseOrder 聚合根,它有两个方法 FinalizeOrder 和 CancelOrder,它们都记录事件:OrderFinaziled 和 OrderCancelled。我被困在建模订单存储库中,我可以使用存储库模式中的这些事件来更新数据库中的实体吗?我不会在每次更改后保存整个聚合根,我只想保存更改的字段,我使用的是 SqlClient,没有 ORM。
我的聚合根基类:
public class AggregateRootBase<TID> : EntityBase<TID>
{
public AggregateRootBase(TID id) : base(id)
{
}
private readonly List<IDomainEvent> recordedEvents = new List<IDomainEvent>();
public IEnumerable<IDomainEvent> GetEvents()
{
return recordedEvents;
}
public void MarkEventsAsProcessed()
{
recordedEvents.Clear();
}
protected void RecordEvent(IDomainEvent @event)
{
recordedEvents.Add(@event);
}
}
Run Code Online (Sandbox Code Playgroud)
PurchaseOrder 类(跳过大多数属性):
public class PurchaseOrder : AggregateRootBase<int>
{
public PurchaseOrder(int id) : base(id)
{
IsFinalized = false;
IsCancelled = false;
}
public bool IsFinalized { get; set; } …Run Code Online (Sandbox Code Playgroud)