0

不显眼的 NServiceBus 示例中,它解释了如何将入站消息映射到端点配置中的 ICommand / IEvent / IMessage ,如下所示:

.DefiningCommandsAs(t => t.Namespace != null && t.Namespace.EndsWith("Commands"))
.DefiningEventsAs(t => t.Namespace != null && t.Namespace.EndsWith("Events"))
.DefiningMessagesAs(t => t.Namespace == "Messages")

但是下面的例子呢,我想创建一个标记接口并让我的所有事件都实现它:

public interface IAmSomeEvent
{
}

public class SomethingImportantHappenned : IAmSomeEvent
{
    public string blah { get; set; }
}

然后做这样的事情:

.DefiningEventsAs(t => t.GetInterfaces().Contains(typeof(IAmSomeEvent)))

但问题是它不起作用(NSB 不会将它映射到 IEvent)。

我可以理解为什么这不起作用,因为 NSB 只是接收 json(或 XML)流,因此它并不真正关心原始类型碰巧实现了某个接口或其他接口。但这将是一个非常好的功能。

有人对如何实现这一目标有任何建议吗?

非常感谢

4

1 回答 1

4

您不需要将接口映射到 NServiceBus 的接口,问题也与它如何进行反序列化无关。

我认为你的事件继承自其他东西,它本身继承自你的标记接口,这就是你的代码不起作用的原因。你看,GetInterfaces 只返回你的类直接实现的接口,而不是完整的继承层次结构。

相反,检查是否 t.IsAssignableFrom(typeof(IAmSomeEvent))。

All that being said, I'm not sure I see the point of this - after all, the conventions were introduced to provide decoupling from infrastructure so that you could have publishers and subscribers depend on different versions of NServiceBus. By introducing your own interface, you seem to be reintroducing that kind of dependency - in short, why not just use the NServiceBus IEvent interface?

于 2012-12-31T14:18:53.057 回答