C# · 12月 22, 2021

c# – 在NServiceBus服务之间共享消息定义

富有想象力的设置

>几项服务
>每个人都住在自己的存储库中
>每个单独开发
>每个单独部署
>他们想通过NServiceBus进行通信

研究

NServiceBus基础知识的示例显示了作为同一解决方案一部分的多个应用程序如何使用另一个共享库项目共享消息定义,它们都引用它们.在这里,如果服务不是同一解决方案的一部分,事情会变得复杂.

我想,共享项目可以被提取到一个单独的存储库中,然后作为DLL或自定义NuGet包从其他存储库中引用.但它在开发过程中会产生很多困难,并且感觉不对.

在这个样本http://docs.particular.net/samples/step-by-step/中,甚至有一条说明:

Storing all message deFinitions in a single location is not a best
practice,but serves to illustrate how things work for this simple
example.

但是我还没有找到最佳实践.

问题:如何以正确的方式在服务之间共享消息定义?

解决方法 你富有想象力的设置很好.但是,每个服务都可以拥有自己的消息程序集,而不是拥有一个共享消息程序集,然后将其作为NuGet程序包发布到专用存储库.

因此,如果您拥有Sales服务(例如,在Sales存储库中),还将包含Sales.Messages项目.它是最基本的形式,它包含Sales服务处理的所有命令的定义,以及Sales服务发布的所有事件的定义.

在Sales.InternalMessages和(我们现在只调用它)Sales.Contracts之间进一步划分消息也是明智的.

内部消息只是在您的服务中被抛出的消息.与私有方法一样,您不希望其他团队能够从您的服务外部调用那些,因此您不会将这些消息作为NuGet包在外部分发.

然后,Sales.Contracts将仅包含那些超出服务的消息.将它们命名为“合同”会提醒您它们是什么 – 服务之间的合同 – 因此您需要对它们进行管理.这意味着需要仔细考虑和版本化对它们的更改.