我正在使用JOlivers CommonDomain和EventStore以及NServiceBus进行测试。我需要在我的集合中提出这样一个事件:
RaiseEvent(bus.CreateInstance<IPhoneNumberChanged>(m => { m.Number = number; }));然后我有了一个处理程序:
private void Apply(IPhoneNumberChanged phoneNumberChangedEvent)
{
this.Number = phoneNumberChangedEvent.Number;
}不幸的是这不起作用。我得到了一个例外:类型为'Phone‘的"CommonDomain.Core.HandlerForDomainEventNotFoundException:聚合引发了一个'IPhoneNumberChanged’类型的事件,但无法找到处理该消息的处理程序。“
这里的问题是从"bus.CreateInstance“创建的对象,因为它与纯具体类一起工作。但我需要我的事件作为接口。这个问题能解决吗?
编辑:只是一个注释-我不需要使用"bus.CreateInstance“来创建对象,这只是我目前必须提高'IPhoneNumberChanged‘的最简单的方式。任何其他方式都是很棒的--只要我在处理程序中有一个作为参数的接口。
发布于 2011-09-03 20:30:34
在电话聚合的构造函数中,只需添加以下内容:
this.Register<IPhoneNumberChanged>(this.Apply);这就解决了例外情况。CommonDomain内部的默认内部路由机制是基于注册的路由器,而不是理解如何将事件传递到适当的句柄方法--所有这些都不需要使用反射。另一个路由器已经被编写,并且已经是CommonDomain项目的一部分,它使用反射,并且更基于约定。
一个关于你的事件名称的快速思考。与其说电话号码改变了,不如让事件说明电话号码更改的原因。从一个领域的角度来看,为什么某事总是更有趣和重要的是什么。一个电话号码改变的事实通常是不有趣的。事实是它改变了,因为那个人转移或者取消了他们的帐户或者其他什么--这很有趣,也很有可能也很重要。
https://stackoverflow.com/questions/7283161
复制相似问题