NServiceBus非突兀模式按类型或接口定义消息



在不引人注目的NServiceBus示例中,它解释了如何将入站消息映射到端点配置中的iccommand/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)流,所以它并不真正关心原始类型碰巧实现了一些接口或其他。但这将是一个非常好的功能。

有谁对如何实现这一点有任何建议吗?

多谢

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

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

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

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

最新更新