我正在使用JOlivers CommonDomain和EventStore与NServiceBus进行测试。我需要像我这样在我的聚合中引发一个事件:
RaiseEvent(bus.CreateInstance<IPhoneNumberChanged>(m => { m.Number = number; }));
然后我有了这个处理程序:
private void Apply(IPhoneNumberChanged phoneNumberChangedEvent)
{
this.Number = phoneNumberChangedEvent.Number;
}
不幸的是,这不起作用。我得到一个例外:“CommonDomain.Core.HandlerForDomainEventNotFoundException:'Phone'类型的聚合引发了一个'IPhoneNumberChanged'类型的事件,但是找不到处理程序来处理该消息。”。
这里的问题是从“bus.CreateInstance”创建的对象,因为它适用于纯混凝土类。但我需要我的事件作为接口。这可以解决吗?
编辑:只是一个注释 - 我不必使用“bus.CreateInstance”来创建对象,这只是我目前提出'IPhoneNumberChanged'的最简单(唯一)方式。任何其他方式也都很棒 - 只要我在处理程序中有一个接口作为参数。答案 0 :(得分:2)
在Phone聚合的构造函数中,只需添加以下内容:
this.Register<IPhoneNumberChanged>(this.Apply);
这将照顾例外。 CommonDomain内部的默认内部路由机制是一个基于注册的路由器,而不是理解如何将事件传递给适当的Handle方法 - 所有这些都不使用反射。已经编写了另一个路由器,它已经是使用反射的CommonDomain项目的一部分,并且更基于约定。
关于您的活动名称的一个快速思考。您可能希望事件指示为什么更改了电话号码,而不是说电话号码已更改。从域的角度来看,事物的原因总是更有趣,更重要的是什么。电话号码通常改变的事实并不有趣。事实是它因为移动或取消了他们的帐户或其他任何东西而改变了 - 这很有趣,而且非常重要。