在CQRS注册事件处理程序 [英] Register EventHandler in CQRS

查看:134
本文介绍了在CQRS注册事件处理程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图利用CQRS和放大器采购领域模型; DDD,我知道我养域事件,但我不知道在哪里,当我使用命令来注册。如果事件处理程序命令处理程序进行注册?也许我误解的东西。这是我的过程你能帮帮模型是正确的方法是什么?



最后确定的采购订单指令下达,比命令处理程序最终确定顺序(从库中获取订单,改变其状态,并保存回到DB),以便最终确定事件发生的域模型,比事件处理程序发现使用ID与行项目这个命令,找到它的供应商联系信息(可能是电子邮件,甚至外部服务),并通知他关于新的采购订单。



我的命令和放大器;命令处理程序是在应用层(事件处理程序也应该在这里?)。
域模型,在领域层事件和IRepositories。
库实现在基础设施层



域模型(跳过大多数属性):

 公共类的PurchaseOrder 
{
公众的PurchaseOrder(INT purchaseOrderID,诠释供应商ID,布尔isOrderFinalized)
{
purchaseOrderID = purchaseOrderID;
供应商ID =供应商ID;
IsOrderFinalized = isOrderFinalized;
}
公众诠释PurchaseOrderID {搞定;私人集; }
公众诠释供应商ID {搞定;私人集; }
公共BOOL IsOrderFinalized {搞定;私人集; }

公共静态的PurchaseOrder CreateNew(INT供应商ID)
{
返回新的PurchaseOrder(0,供应商ID,FALSE);
}

公共无效FinalizeOrder()
{
IsOrderFinalized = TRUE;
DomainEvents.Raise(新PurchaseOrderFinalized(PurchaseOrderID));
}
}



FinalizePurchaseOrder命令



 公共类FinalizePurchaseOrder:ICommand的
{
公共FinalizePurchaseOrder(INT purchaseOrderID)
{
purchaseOrderID = purchaseOrderID;
}
公众诠释PurchaseOrderID {搞定;私人集; }
}



命令处理程序

 公共类PurchaseOrdersCommandHandler:ICommandHandler< FinalizePurchaseOrder> 
{
公共无效手柄(FinalizePurchaseOrder命令)
{
VAR purchaseOrder的= purchaseOrderRepository.FindByID(command.PurchaseOrderID);
//我应该在这里注册的事件处理程序?
// DomainEvents.Register< PurchaseOrderFinalized>(PurchaseOrderFinalizedHandler);
purchaseOrder.FinalizePurchaseOrder();
purchaseOrderRepository.Save(purchaseOrder的);
}
}



事件和事件处理程序是这样的:

 公共类PurchaseOrderFinalized 
{
公共PurchaseOrderFinalized(INT purchaserOrderID)
{
PurchaseOrderID = purchaseOrderID;
}
}

公共无效PurchaseOrderFinalizedHandler(PurchaseOrderFinalized EVT)
{
// TODO:获取的PurchaseOrder其行项目,以及有关新的供应商通知为了
}


解决方案

如果事件处理程序命令处理程序进行注册?




不,除非它们是动态的,没有。您通常会连线它们在你的应用程序的 CompositionRoot 。这个想法是,所有的接线高达发生时,你的应用程序加载之前它是准备好了。



你在哪里注册您的命令处理程序?你应该在同一个地方注册的事件处理程序。



[更新]



有关示例,请参阅 https://github.com/gregoryyoung/mr/blob/master /CQRSGui/Global.asax.cs


I am trying to model purchasing domain using CQRS & DDD, i know that i raise events in domain but i don't know where to Register them when i am using commands. Should event handlers be registered in command handlers? or maybe i misunderstood something. this is my process can you help model it right way?

Finalize purchase order Command is given, than command handler finalizes order (gets order from repository, changes its state and saves back to db), order finalized event occurs in domain model, than event handler finds this order using id with its line items, find it suppliers contact info(may be email or even external service) and notifies him about new purchase order.

My Commands & Command Handlers are in Application Layer(Event Handlers should be here also?). Domain Model, Events and IRepositories in Domain Layer. Repository Implementations in Infrastructure Layer.

Domain Model (skipped most of properties):

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 Command

public class FinalizePurchaseOrder : ICommand
{
   public FinalizePurchaseOrder (int purchaseOrderID)
   {
      PurchaseOrderID = purchaseOrderID;
   }
   public int PurchaseOrderID { get; private set; }
}

Command Handler

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

Event and Event Handler looks like this:

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
}

解决方案

Should event handlers be registered in command handlers?

Not unless they are dynamic, no. You would typically wire them up in your application's CompositionRoot. The idea being that all the wiring up takes place when your app loads and before it is "ready".

Where are you registering your command handlers? You should be registering your event handlers in the same place.

[UPDATE]

For an example, see https://github.com/gregoryyoung/m-r/blob/master/CQRSGui/Global.asax.cs

这篇关于在CQRS注册事件处理程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆