在不引人注目的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接口呢?