Nservicebus N服务总线:订阅具有特定属性值的事件

Nservicebus N服务总线:订阅具有特定属性值的事件,nservicebus,Nservicebus,给定以下事件,是否有方法订阅具有特定属性值的事件?例如,仅订阅OperationTypeId为3的事件 public interface IServerEvent : IEvent { int OperationTypeId { get; set; } string SomeValue { get; set; } } 我正在使用NServiceBus 6.0.0 这种情况的用例是可以在服务器上创建新的OperationType,因此我们需要一个“通用”事件结构。我希望订阅者能够

给定以下事件,是否有方法订阅具有特定属性值的事件?例如,仅订阅OperationTypeId为3的事件

public interface IServerEvent : IEvent
{
    int OperationTypeId { get; set; }
    string SomeValue { get; set; }
}
我正在使用NServiceBus 6.0.0

这种情况的用例是可以在服务器上创建新的OperationType,因此我们需要一个“通用”事件结构。我希望订阅者能够只接收他们感兴趣的OperationType的事件,而不要求发布者将所有事件发送给所有订阅者并进行订阅者筛选


我希望NServiceBus的发布端可以处理筛选器以减少发布的事件数。

不是现成的-但是如果您的后端使用RabbitMq,您可以使用IRoutingTopology使用OperationTypeId路由密钥路由这些特定消息。然后,您可以在订阅服务器上使用相同的拓扑,只订阅特定的路由密钥, 前面的答案是正确的,通常您会按类型或界面等区分不同的内容,并且只订阅该类型,以便发布者能够区分

另一个想法可能是关于这些是否是事件?如果您遇到的是一个通用消息,而该消息的内容不能是强类型的,并且可以动态更改,那么您可能希望放弃内置的基于类型的路由,自己管理消息调度。然后,您可以只使用命令并根据您的示例中的OperationTypeId使用基于内容的路由器来调度它们

更新版本6中有一些客户路由功能,允许您在此处使用一些潜在的灵活性:请参阅本文和示例:

问候,,
Joe

订阅活动的缺点是什么,只对符合你标准的活动采取行动,而忽略其他活动

如果您控制着发布端,并且如果那些具有特定值的事件对业务有意义,那么您可能需要打破一般事件,发布更细粒度的事件

至于为什么NServiceBus不支持基于内容的路由,也许是原作者的一篇好文章


TL;DR“因为这是一种通常应该避免的危险模式”

Hadi,谢谢你的文章,我确实理解你的观点和Udi。我正在开发一个重视灵活性而不是静态消息的系统,我不一定同意,但需要了解双方。Joe,如果我读对了这一点,这个解决方案将非常需要和架构的改变,并将使这个路由器成为一个中心。如果这是最好的方法,我们可能最终会使用Rabbit MQ之类的东西,我也需要对此进行回顾。谢谢你的文章!我们还将审查RabbitMQ作为解决方案。感谢您的建议。AFAIK-如果您的示例不能按照上述用户的建议进行更改,那么这是唯一可以做您想做的事情的方法。NSB不允许基于上下文的路由,但在使用RabbitMq时存在漏洞。