【问题标题】:NServiceBus Unobtrusive Conventions DefiningCommandsAs multiple timesNServiceBus Unobtrusive Conventions DefiningCommandsAs 多次
【发布时间】:2016-03-16 07:26:22
【问题描述】:

似乎我不能多次定义命令/事件约定。每个注册的约定都将覆盖以前的约定。

这行得通:

 configuration.Conventions()
            .DefiningCommandsAs(
                type => type.FullName == "MyProject1.CommandA" || type.FullName == "MyProject2.CommandB");

但这不是:

        configuration.Conventions()
            .DefiningCommandsAs(
                type => type.FullName == "MyProject1.CommandA");

        configuration.Conventions()
            .DefiningCommandsAs(
                type => type.FullName == "MyProject2.CommandB");

我为什么需要这个:

我正在开发一个曾经在 NSB 项目中引用的包,它将执行定期操作(发送消息)。它需要在INeedInitialization 中定义自己的命令约定,这些约定将在程序集扫描期间获取。我不希望包的用户知道他需要注册包的约定。但是宿主项目需要为命令注册自己的约定。所以目前看来我要么需要求助于标记接口(我不想这样做,引入不显眼模式是有充分理由的),要么提出所有命令必须驻留在 *.Commands 中的约定。 * 我也不喜欢的命名空间。

所以问题是如何让包注册它自己的约定,对主机不显眼且透明。

编辑

我能想到的另一种解决方法是实现共享约定单例并将约定注册委托给它。然后,该单例将记住所有约定,并且每次都会继续附加它们。不漂亮,但不比其他 2 个选项丑。

【问题讨论】:

  • 抱歉,除了您提到的两个(标记和命令命名空间)之外,我认为这里没有任何选项。我会亲自使用 .commands 命名空间约定。
  • @TylerDay 谢谢,这就是我所怀疑的。如果 Particular 计划在 v6 中解决这个问题,有什么线索吗?
  • 我不知道,但如果我不得不猜测,我会说这可能是设计使然,而不是错误。不过,这将是一个不错的功能。

标签: nservicebus convention unobtrusive


【解决方案1】:

不支持多次调用的消息约定绝对是设计使然。这是为了防止对消息的含义有多种意见。让它们具有附加性意味着任何人都可以发表意见。

因此,此模式旨在提供摩擦,以使您就Command在整个系统中的含义达成一致。基本上,SOA 原则 #4:服务兼容性基于策略。很多时候这是“以.Commands 结尾的命名空间”模式;我个人用过那个,效果很好。

我确实为 Particular 工作,所以虽然没有什么是一成不变的,但我可以相当自信地说 V6 中没有改变这一点的计划。

如果您绝对需要做一些不同的事情,您在编辑中创建某种MessageRegistry 单例并将约定委托给MessageRegistry.IsCommand(Type) 的想法是完全有效的。在 V5 中,在总线启动之前不会执行任何操作,因此只要在总线启动之前填充 MessageRegistry(也可以在 INeedInitialization 中完成),那么一切都应该很好。

如果您确实走这条路,我鼓励您一路走下去,让您的注册表单例负责其他元数据,例如 TimeToBeReceived、DataBus、WireEncryptedString、Express 以及任何其他基于属性的消息元数据。

【讨论】:

  • David,感谢您的明确回答,我试图弄清楚您是如何在自己的 ServicePulse Heartbeats 中实现这一点的? EndpointHeartbeat 命令没有标记接口,也没有在某些 .Commands 命名空间中。是不是有什么内幕? github.com/Particular/ServiceControl.Plugin.Nsb5.Heartbeat
  • 我们对 ServiceControl 插件消息使用较低级别的消息传输接口,因此它们不包含在用户代码级别的一般消息池中。它们也是内部类,您不能自己发送 EndpointHeartbeat。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 2015-01-09
  • 2014-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多