如何在JOlivers CommonDomain和EventStore中将接口用作事件?

时间:2011-09-02 12:06:36

标签: nservicebus cqrs event-sourcing event-store

我正在使用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'的最简单(唯一)方式。任何其他方式也都很棒 - 只要我在处理程序中有一个接口作为参数。

1 个答案:

答案 0 :(得分:2)

在Phone聚合的构造函数中,只需添加以下内容:

this.Register<IPhoneNumberChanged>(this.Apply);

这将照顾例外。 CommonDomain内部的默认内部路由机制是一个基于注册的路由器,而不是理解如何将事件传递给适当的Handle方法 - 所有这些都不使用反射。已经编写了另一个路由器,它已经是使用反射的CommonDomain项目的一部分,并且更基于约定。

关于您的活动名称的一个快速思考。您可能希望事件指示为什么更改了电话号码,而不是说电话号码已更改。从域的角度来看,事物的原因总是更有趣,更重要的是什么。电话号码通常改变的事实并不有趣。事实是它因为移动或取消了他们的帐户或其他任何东西而改变了 - 这很有趣,而且非常重要。