小编Qui*_*NaN的帖子

在CQRS中注册EventHandler

我正在尝试使用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)

c# events domain-driven-design event-handling cqrs

5
推荐指数
1
解决办法
1101
查看次数

使用领域事件更新数据库中的实体

我有一个 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)

c# events domain-driven-design repository aggregateroot

1
推荐指数
1
解决办法
816
查看次数