在unobtrusive NServiceBus sample中,它解释了如何在端点配置中将入站消息映射到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)流,因此它并不真正关心原始类型恰好实现某些接口或其他。但这将是一个非常好的功能。
有没有人对如何实现这一点有任何建议?
非常感谢
答案 0 :(得分:4)
您不需要将您的界面映射到NServiceBus的界面,问题也不会与反序列化的方式有关。
我认为你的事件继承自你的标记界面继承的其他东西,这就是你的代码不起作用的原因。你看,GetInterfaces只返回你的类实现的接口 ,而不是完整的继承层次结构。
相反,检查是否t.IsAssignableFrom(typeof(IAmSomeEvent))。
所有这一切,我不确定我是否明白这一点 - 毕竟,引入了约定以提供与基础设施的分离,以便您可以让发布者和订阅者依赖于不同版本的NServiceBus。通过引入自己的接口,您似乎重新引入了这种依赖 - 简而言之,为什么不使用NServiceBus IEvent接口?