C# 在NServiceBus 6中,端点是否可以在不知道发布端点的情况下订阅事件?

C# 在NServiceBus 6中,端点是否可以在不知道发布端点的情况下订阅事件?,c#,nservicebus,publish-subscribe,C#,Nservicebus,Publish Subscribe,我已更新到NServiceBus 6,其中IProvideConfiguration及其MessageEndpointMappings已过时 我已经按照文档中的发布/订阅说明进行了操作。据我所知,现在需要在订阅事件时显式命名发布端点 在此之前,我可以指定事件接口,端点将是订阅服务器的名称: config.MessageEndpointMappings.Add( new MessageEndpointMapping {

我已更新到NServiceBus 6,其中
IProvideConfiguration
及其
MessageEndpointMappings
已过时

我已经按照文档中的发布/订阅说明进行了操作。据我所知,现在需要在订阅事件时显式命名发布端点

在此之前,我可以指定事件接口,端点将是订阅服务器的名称:

config.MessageEndpointMappings.Add(
                new MessageEndpointMapping
                {
                    AssemblyName = MyAssemblyName,
                    TypeFullName = typeof( IMyEvent ) ),
                    Endpoint = "SubscribingEndpoint"
                } );
现在: 这件事过去了,我有以下几点。这完全取代了
i配置
类的需要:

    var routing = endpointConfiguration.UseTransport<MsmqTransport>().Routing();
    endpointConfiguration.SendFailedMessagesTo( "error" );
    endpointConfiguration.AuditProcessedMessagesTo( "audit" );
    //register command
    routing.RouteToEndpoint( typeof( MyCommand), "SomeEndpoint" );
    //subscribe to event
    routing.RegisterPublisher(typeof(IMyEvent), "PublishingEndpoint" ); //?
var routing=endpointConfiguration.UseTransport().routing();
endpointConfiguration.SendFailedMessageTo(“错误”);
endpointConfiguration.AuditProcessedMessageTo(“审核”);
//寄存器命令
routing.RouteToEndpoint(typeof(MyCommand),“SomeEndpoint”);
//订阅活动
路由。注册发布器(typeof(IMyEvent),“PublishingEndpoint”);/?
所以这里我必须指定IMyEvent的发布者,而不是订阅者。 在NSB5中,这是不必要的


那么,如果事件由多个端点发布,我该怎么办?

回答您的问题:

那么,如果事件由多个端点发布,我该怎么办

您可以通过订阅者的多个
RegisterPublisher
呼叫从多个发布者订阅同一事件

请注意,如果从多个逻辑端点发布同一事件,则通常将其视为气味。您可能需要考虑为每个逻辑端点使用不同的事件类型,或者可能从事件切换到命令。如果您对消息设计不确定,强烈建议访问,人们非常乐意帮助您解决设计问题,这些问题扩展了此问题

关于V5和V6之间的更改:

在NSB5 I中,订阅者将如上文所示,通过在MessageEndpointMapping中使用自己的端点名称而不是发布者的端点名称进行订阅

我很难理解这句话。V5和V6使用相同的订阅方法,只是语法不同

由于您使用的是MSMQ,订阅者必须向事件的每个发布者发送订阅消息。为了让订阅者知道将订阅消息发送到哪里,它需要此消息的路由信息。这是V5和V6使用不同语法的地方:

  • V5将在其MessageEndpointMappings中查找匹配的路由。它将向映射中指定的端点发送订阅消息(在示例代码中为
    subscriptingendpoint
  • V6强制执行订阅消息和命令之间的分离。这就是为什么有不同的API用于路由常规命令和路由订阅消息。基于代理的传输(例如RabbitMQ)不需要订阅消息,因此不需要订阅消息路由,而每个传输仍然需要路由信息来发送命令
正如您所看到的,V5和V6之间只有语法上的差异,概念上应该没有变化。由于您声称上述示例对您有效,我只能想象以下几个原因:

  • 您的逻辑端点共享相同的订阅存储,这可能会导致发送到订阅服务器端点的订阅消息意外地对发布服务器可见
  • 发布服务器使用的持久订阅存储已包含来自订阅服务器的订阅。尽管它可能不再接收订阅消息(因为在您的配置中它不应该接收),但它仍然有一个由发布者使用的“旧”订阅
无论这些原因之一是否可以解释您看到的行为,当将MSMQ传输与NServiceBus一起使用时,订阅服务器始终需要配置到发布服务器的路由,以便订阅消息到达发布服务器。这种设计在V5和V6之间没有改变

在特定文档中提供了一个很好的示例,演示了V5和V6中的发布/订阅:

我已更新到NServiceBus 6,其中IProvidConfiguration及其MessageEndpointMappings已过时

请注意,在V6中,这两个API都已过时并带有警告,但它们仍然可以继续工作。这些API将在下一个主要版本中删除


我希望这能让事情澄清一点。

事件总是只从一个端点发布(按照规则,只有一个发布者…),而且您总是需要为事件提供发布者地址。。。你想做什么?@SeanFarmar我知道一个事件只能由一个端点发布。在NSB5 I中,订阅者将如上文所示,通过在MessageEndpointMapping中使用自己的端点名称而不是发布者的端点名称进行订阅。v5文档也说明了这一点。这更多的是一个配置问题,而不是一个事件与命令的问题。在这种情况下,发送命令会起作用,但为其设置路由需要更多的工作。我很困惑,您能否提供一个链接,说明您可以使用端点的名称而不是发布者的端点名称?AFAIK订阅者总是向发布者发送订阅消息,因此在配置中需要发布者的端点名称,这是有道理的。。。