0

我正在使用带有 NServiceBus 的JOlivers CommonDomain 和 EventStore 进行测试。我需要像这样在我的聚合中引发一个事件:

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

4

1 回答 1

2

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

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

这将处理异常。CommonDomain 内部的默认内部路由机制是基于注册的路由器,它了解如何将事件传递给适当的 Handle 方法——所有这些都无需使用反射。另一个路由器已经被编写并且已经是 CommonDomain 项目的一部分,它使用反射并且更加基于约定。

快速思考一下您的活动名称。您可能希望事件指示电话号码更改的原因,而不是说电话号码已更改。从领域的角度来看,为什么某事总是比什么更有趣和重要。电话号码更改通常并不有趣。由于该人移动或取消了他们的帐户或其他原因,它发生了变化的事实——这很有趣,而且很可能也很重要。

于 2011-09-03T20:30:34.210 回答