我们的情况是我们的一个组件是在 Nservice bus 2.6 中开发的。我们目前正在使用 NSB 3.2 开发一个新的组件,该组件将从旧服务中使用。我们在从 NSB 3.2 到 NSB 2.6 组件共享合同时遇到问题。我们不能立即将旧系统迁移到 NSB 3.2,因为这将是很多工作。有没有人有类似的问题?
2 回答
特别是如果您尝试对 3.2 消息合同使用不显眼模式,您将遇到 NServiceBus 2.6 对引用 NServiceBus.dll 版本 2.6 以访问 IMessage 接口的硬性要求。
当然,2.6 也没有 IEvent 和 ICommand 的概念。
一种解决方案是为您的 3.2 消息合同程序集创建双重项目。
MyPublisher.Events-2-6.csproj
MyPublisher.Events-3-2.csproj
每个项目将引用相同的 C# 文件,但 2.6 版本将引用 2.6 NServiceBus.dll,而 3.2 版本将引用 3.2 版本,或者如果使用 Unobtrusive,则可能包含一个附加文件来定义特定于程序集的 IEvent、ICommand , iMessage 接口。当然,您也可以在命名空间名称或其他一些指标上使用条件来定义这些并跳过该步骤。
那么您可能需要的最后一件事是#if
在您的消息合约中使用一些块来指定版本之间的差异,例如:
#if NSBGT3
public void MyEvent : IEvent
#else
public void MyEvent : IMessage
#endif
{
// properties
}
完全披露:我自己还没有尝试过,我一直在想这就是我将如何去做。试一试并发布一些消息,然后检查它们并查看消息 XML 中关于消息适用的类型的内容。这将使您更好地了解 NServiceBus 2.6 是否会正确接受它们,尤其是在涉及多态消息处理的情况下。当然,您还需要使用 3.2 客户端和 2.6 客户端进行测试。
祝你好运!
我建议在新系统的解决方案中链接旧系统的类文件,这样它们将与较新的 NServiceBus 二进制文件一起编译,您将避免版本冲突。