NServiceBus非干扰模式按类型或接口定义消息

NServiceBus非干扰模式按类型或接口定义消息,nservicebus,Nservicebus,在中,它解释了如何将入站消息映射到端点配置中的ICommand/IEvent/IMessage,如下所示: .DefiningCommandsAs(t => t.Namespace != null && t.Namespace.EndsWith("Commands")) .DefiningEventsAs(t => t.Namespace != null && t.Namespace.EndsWith("Events")) .DefiningMessa

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

有人对如何实现这一目标有什么建议吗


非常感谢

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

我认为您的事件继承自其他东西,而这些东西本身继承自您的标记接口,这就是代码无法工作的原因。您可以看到,GetInterfaces只返回类直接实现的接口,而不是完整的继承层次结构

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


尽管如此,我不确定我是否明白这一点——毕竟,引入这些约定是为了提供与基础设施的解耦,以便让发布者和订阅者依赖于不同版本的NServiceBus。通过引入您自己的接口,您似乎重新引入了这种依赖关系—简而言之,为什么不使用NServiceBus IEvent接口?

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

我认为您的事件继承自其他东西,而这些东西本身继承自您的标记接口,这就是代码无法工作的原因。您可以看到,GetInterfaces只返回类直接实现的接口,而不是完整的继承层次结构

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


尽管如此,我不确定我是否明白这一点——毕竟,引入这些约定是为了提供与基础设施的解耦,以便让发布者和订阅者依赖于不同版本的NServiceBus。通过引入您自己的接口,您似乎重新引入了这种依赖关系—简言之,为什么不直接使用NServiceBus IEvent接口?

谢谢Udi—但是,如果IsAssignableFrom()不是必需的(而且也不起作用),该接口将直接实现。作为对为什么这样做的回应,它只是基于名称空间的匹配的一种替代方法。在我的例子中,我的事件并不都在以任何特定内容开头/结尾的名称空间中。您可以在约定中使用前缀或后缀-例如,类型名称以单词“Event”结尾的任何内容。感谢Udi-但是,在事件中直接实现接口IsAssignableFrom()是不必要的(也不起作用)。作为对为什么这样做的回应,它只是基于名称空间的匹配的一种替代方法。在我的情况下,我的事件并不都在以任何特定内容开头/结尾的名称空间中。您可以使用前缀或后缀作为约定-例如,类型名称以单词“Event”结尾的任何内容。请确保您的邮件包含在扫描的类型列表中。谢谢你。因此,如果包含“我的邮件”的程序集与nservicebus.host.exe位于同一目录中,是否应该对其进行扫描?默认情况下,将扫描所有程序集。如果您硬编码t==typeof(somethingimportanthanappended),该约定有效吗?只是为了排除asm scanningHi Andreas的问题谢谢您的回复,但我已经转移到另一个问题上-请您看一下好吗?确保您的邮件包含在扫描的类型列表中。谢谢你。因此,如果包含“我的邮件”的程序集与nservicebus.host.exe位于同一目录中,是否应该对其进行扫描?默认情况下,将扫描所有程序集。如果您硬编码t==typeof(somethingimportanthanappended),该约定有效吗?只是为了排除asm scanningHi Andreas的问题谢谢您的回复,但我已经转移到另一个问题上-请您看一下好吗?