使用 NServiceBus 时如何在应用程序之间共享消息类?

发布于 2024-07-22 06:15:20 字数 539 浏览 6 评论 0原文

所以我有两个独立的应用程序,我想在它们之间发送消息。 我碰巧正在使用 NServiceBus,但这并不重要。 如何从应用程序 A 向应用程序 B 发送消息并让它们都知道同一个合约?

所以应用程序 A 有一个类 SecretMessage...

public class SecretMessage : IMessage
{
     public string Title { get; set; }
     public string Body { get; set; }
}

这是将被序列化并通过线路发送到应用程序 B 的对象。

现在在应用程序 B 中,我如何侦听该类型的消息,然后能够de-将它们序列化到同一个类? 因此我可以在发送数据时使用数据,而不会成为维护的噩梦。

应用程序 B 是否只需要拥有该类的副本? 这是否应该通过每个应用程序都引用的消息类的共享 dll 来处理(我希望不是)? 是否应该在每个应用程序中将它们重新创建为具有相同属性的完全独立的 DTO?

我在这里错过了什么吗?

So I have two separate applications that I want to send messages between. I happen to be using NServiceBus, but that shouldn't really matter. How do I send a message from application A to application B and have them both be aware of the same contract?

So app A has a class SecretMessage...

public class SecretMessage : IMessage
{
     public string Title { get; set; }
     public string Body { get; set; }
}

This is the object that will be serialized and sent over the wire to app B.

Now in app B, how do I listen for messages that are of that type and then be able to de-serialze them to the same class? So I can use the data as it was sent, without this being a maintenance nightmare.

Does app B just have to have a copy of the class? Should this be handled through a shared dll of message classes that each app has a reference to (I hope not)? Should they be recreated in each app as completely separate DTO's with the same properties?

Am I missing something here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

独﹏钓一江月 2024-07-29 06:15:20

这可能不是您想要的答案,但这里的灵丹妙药很少。

您实际上只有几个选择,因此取决于您在消息类中想要的功能级别和类型强化:

  1. 共享 DLL - 好处是它可以是代码 + 结构,例如有用的构造函数、复杂的枚举器、调试ToString 实现等。强版本控制。 DLL 需要单独的项目和分发。
  2. 共享架构和代码生成。 声明类型的架构并使用代码生成来创建类。 这里有很多不同的策略 - 一些示例:T4 模板自定义代码生成、工具和库,例如 CodeSmithProto .Bufs。 搜索会发现你加载更多。 可以非常强大 - 了解许多代码商店,它们通过使用 CodeGen 从数据库到 UI 进行快速原型设计来启动所有项目。 您仍然需要分发架构。
  3. 以足够的保真度序列化消息以通过 Code DOM 生成类型。 每条消息都会产生携带足够类型元数据来代表其所有消息实例的成本。 例如可为空字段的表示。 生成消息包装类型还存在固有的第一次“发现”成本。
  4. 以弱结构(例如名称/值对)序列化数据,然后生成类似字典的包装类。 弱类型 - 很容易扩展。

这些确实是唯一的选择。 恕我直言,#2 然后#1 按此顺序通常是最有用的模式。

It may not be the answer you want but there are very few silver bullets here.

You've really only got a few choices, and as such then depends on the level of functionality and type-hardening you want in your message classes:

  1. Shared DLL's - benefit that it can be code + structure e.g. useful constructors, complex enumerators, debugging ToString implementations etc. Strong versioning. Requires separate project and distribution for DLL.
  2. Shared Schema and Code Generation. Declare schema for your types and use code generation to create classes. Lots of different strategies here - some examples: T4 Templating, Custom Code Generation, Tools and libraries such as CodeSmith or Proto.Bufs. Search will find you loads more. Can be pretty powerful - know many codeshops that start all projects through rapid prototyping with CodeGen from DB through to UI. You'd still need to distribute schema.
  3. Serializing message with enough fidelity to generate types through Code DOM. Each message incurs the cost of carrying enough type metadata to be representative of all it's message instances. e.g. representations of nullable fields. There would also be an intrinsic 1st time "discovery" cost to generate the message wrapper types.
  4. Serialize data in a weak structure such as name/value pairs, then generate dictionary-like wrapper classes. Weak typing - easy to extend tho'.

Those really are the only choices. IMHO #2 then #1 in that order are typically the most useful patterns.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文