【问题标题】:NServiceBus PubSub - how to break binary dependencies between pub'r and sub'r?NServiceBus PubSub - 如何打破 pub'r 和 sub'r 之间的二进制依赖关系?
【发布时间】:2011-05-25 10:34:57
【问题描述】:

我需要构建一个 NSB 订阅者,该订阅者将订阅由已经上线的服务发布的消息。该服务是使用包含我要订阅的 NSB IMessage 实现的消息程序集构建的。所以要建立我的订阅者,我需要对这个程序集有一个硬依赖。

当我的订阅者启动时,它会向发布者输入队列发送一些消息,从而导致发布者将我的订阅记录在数据库中。我的订阅之一如下所示:

MyNamespace.MyMessageType, MyNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=MyPublicKeyToken

不幸的是,发布者正在从非强命名的程序集发布消息。因此,在发布时,订阅评估过程无法针对我的订阅成功评估,因为正在发布的消息的公钥令牌(值 = null)与我的订阅不匹配。

我的问题是:我不能只按类型和版本订阅消息吗?更好的是 - 我可以不订阅基于某些外部合同(如 XSD)的消息并完全打破这种依赖关系吗?

非常感谢。

更新:NSB 文档在这里暗示了这样的事情:

http://www.nservicebus.com/MessagesAsInterfaces.aspx

【问题讨论】:

  • 是否有一个强大的商业案例,为什么消息程序集必须是强命名的?
  • 好吧,这不是商业案例,但总的来说,进入具有强命名代码的生产环境会更安全。如果此依赖项是第三方的(不是),那么我将遇到真正的问题,因为我不知道程序集是否来自受信任的来源。不过我知道你在说什么。事实上,我并没有因此而受阻,因为我已经要求开发消息的团队简单地签署消息程序集。但是我的帖子仍然有效。使用 NSB pubsub 时,您将始终对发布者有硬依赖,如果您仅使用 Bus.Send(),则不存在这种依赖。

标签: nservicebus publish-subscribe


【解决方案1】:

对于您创建的常规消息,您可以使用 NSB 的工具目录中的 XsdGenerator 工具来生成可以传递给其他端点的模式。您将希望使用此工具而不是 .NET Framework 工具,因为它不支持接口。从那里您可以使用架构来处理消息。

对于订阅消息,如果您不想使用程序集,您可以告诉 NSB DoNotAutoSubscribe() 并手动订阅 (Bus.Subscribe(Type)) 传递您希望的消息类型。这可能与架构或其他配置无关。

【讨论】:

  • 谢谢亚当。然而,这不是答案。我可以通过简单地引用一个本地程序集来打破服务/消费者点对点消息传递解决方案中的二进制依赖关系,该程序集的类型定义允许对来自网络的 XML 进行干净的反序列化,在这种情况下,通过让服务运行“AsA_Server”。当服务运行“AsA_Publisher”时会创建硬依赖,并且订阅者会发送基于引用程序集反射的订阅消息。
  • 如果您不想使用程序集,您可以告诉 NSB DoNotAutoSubscribe() 并手动订阅 (Bus.Subscribe(Type)) 传递您希望的消息类型。这可能与架构或其他一些配置无关。这行得通吗?
  • 嗨,亚当。如果您可以发送对发布者有效的订阅消息,那么我看不出为什么这不起作用。这听起来像是打破依赖关系的最佳解决方案。请将此作为正确的 stackoverflow 答案,我将对其进行投票并标记为这样。谢谢! TC
  • 但是,发送正确的“有效”订阅消息可能是一个相当大的挑战。在这种情况下有效是指发布者能够成功地对其进行评估并作为评估的结果发送消息。当然没有内置支持。
  • 已编辑以包含来自 cmets 的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
相关资源
最近更新 更多