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

Rya*_*ery 4 architecture messaging nservicebus

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

所以app A有一个类SecretMessage ......

public class SecretMessage : IMessage
{
     public string Title { get; set; }
     public string Body { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

现在在应用B中,我如何监听那种类型的消息,然后能够将它们反序列化到同一个类?所以我可以使用发送的数据,而不会成为维护的噩梦.

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

我在这里错过了什么吗?

ste*_*hbu 6

它可能不是你想要的答案,但这里只有很少的银子弹.

您实际上只有一些选择,因此取决于您在消息类中所需的功能级别和类型强化:

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

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