如何避免对 rebus 消息的编译时依赖性?
how to avoid compile time dependency to a rebus message?
我想通过上下文 A 引发的事件集成两个限界上下文并使用来自上下文 B 的事件。
我怎么想避免编译时间依赖性,所以上下文 B 不必包含上下文 A 的 dll's/libraries。(至少我不想每次都需要更新对 A 的引用的麻烦上下文 A 公开了新的事件类型。
是否有 prefered/best 对 Rebus 进行此操作的做法?
实际上有几种方法:)
就我而言,我更喜欢将消息作为单独的 NuGet 包分发 – 然后就需要查看 packages.config
以查看每个端点具有哪些依赖项。
只要我保持发布的消息模式不可变(即遵循严格的 append-only 方法来改进它),使用事件就没有问题——当反序列化为旧版本的消息架构。
但是,如果您希望端点的耦合度比这低,您可以做几件事。
除非您更改序列化程序,否则消息将序列化为 UTF8 编码 JSON。这意味着订阅者总是可以安装自己的 JSON 序列化程序,例如将消息反序列化为它自己的类型,或者简单地反序列化为 JObject
(假设您使用的是 Newtonsoft JSON.NET)。
事实上 - 如果我没记错的话 - 您可以包含 NuGet 包 Rebus.NewtonsoftJson
并通过
使用它
Configure.With(new CastleWindsorContainerAdapter(container))
.(...)
.Serialization(s => s.UseNewtonsoftJson())
.Start();
它结合了 Newtonsoft 的 JObject
,然后您可以通过实现 IHandleMessages<JObject>
.
在您的消息处理程序中使用它
希望能给你一些启发:)
我想通过上下文 A 引发的事件集成两个限界上下文并使用来自上下文 B 的事件。 我怎么想避免编译时间依赖性,所以上下文 B 不必包含上下文 A 的 dll's/libraries。(至少我不想每次都需要更新对 A 的引用的麻烦上下文 A 公开了新的事件类型。
是否有 prefered/best 对 Rebus 进行此操作的做法?
实际上有几种方法:)
就我而言,我更喜欢将消息作为单独的 NuGet 包分发 – 然后就需要查看 packages.config
以查看每个端点具有哪些依赖项。
只要我保持发布的消息模式不可变(即遵循严格的 append-only 方法来改进它),使用事件就没有问题——当反序列化为旧版本的消息架构。
但是,如果您希望端点的耦合度比这低,您可以做几件事。
除非您更改序列化程序,否则消息将序列化为 UTF8 编码 JSON。这意味着订阅者总是可以安装自己的 JSON 序列化程序,例如将消息反序列化为它自己的类型,或者简单地反序列化为 JObject
(假设您使用的是 Newtonsoft JSON.NET)。
事实上 - 如果我没记错的话 - 您可以包含 NuGet 包 Rebus.NewtonsoftJson
并通过
Configure.With(new CastleWindsorContainerAdapter(container))
.(...)
.Serialization(s => s.UseNewtonsoftJson())
.Start();
它结合了 Newtonsoft 的 JObject
,然后您可以通过实现 IHandleMessages<JObject>
.
希望能给你一些启发:)