NServiceBus unobtrusive模式按类型或接口定义消息

时间:2012-12-31 13:04:21

标签: nservicebus

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)流,因此它并不真正关心原始类型恰好实现某些接口或其他。但这将是一个非常好的功能。

有没有人对如何实现这一点有任何建议?

非常感谢

1 个答案:

答案 0 :(得分:4)

您不需要将您的界面映射到NServiceBus的界面,问题也不会与反序列化的方式有关。

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

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

所有这一切,我不确定我是否明白这一点 - 毕竟,引入了约定以提供与基础设施的分离,以便您可以让发布者和订阅者依赖于不同版本的NServiceBus。通过引入自己的接口,您似乎重新引入了这种依赖 - 简而言之,为什么不使用NServiceBus IEvent接口?