Rebus服务巴士。如何映射不同的类型/接口

时间:2015-10-16 16:36:13

标签: rebus

我还没有找到如何使用其他界面然后发布的解决方案。

在简单的情况下,如果我想发布IMessage并使用IMessage,我必须在两个应用程序之间共享具有IMessage定义的程序集。

但如果这两个应用程序是由不同的公司开发的话。

在这种情况下,我有两个选择:

  1. 就通用接口,命名约定等达成协议并共享公共库

  2. 让两家公司按照惯例和内部服务总线(或应用服务器)地图数据类型完成工作。

  3. 第二个选项对我来说更合适,但我还没有找到解决方案。

    例如,我可能在一个系统中有一名员工

    public interface IEmployee
    {
        int ID { get; set; }
        string FirstName { get; set; }
        string LastName { get; set; }
    }
    

    在其他系统中

    public interface ILightEmployee
    {
        int id { get; set; }
        string full_name { get; set; }
    }
    

    我想发布IEmployee并使用ILightEmployee。

    在我想要的服务总线的序列化/反序列化阶段 使用一些属性映射并存档这样的东西(它更像是一个伪代码):

    public class ContractMapper
    {
        public LightEmployee Map(IEmployee employee)
        {
            return new LightEmployee()
            {
                id = employee.ID,
                full_name = employee.LastName + " " + employee.FirstName
            };
        }
    }
    

    例如,MuleESB为此转换/映射提供了一个编辑器。 LINK

    这对我来说是不必要的高级解决方案,但至少在代码中我想做同样的事情。

    是否可以使用Rebus服务总线?

1 个答案:

答案 0 :(得分:0)

只要Rebus能够将传入的JSON对象正确反序列化为具体类,它就会尝试将消息分发给所有与多态兼容的处理程序。

使用默认的Newtonsoft JSON.NET和Jil-based JSON serializerrbs2-content-type标头将设置为application/json;charset=utf-8,并且只要传入消息的标头以application/json开头并且具有兼容的编码,两个序列化器都会尝试反序列化为rbs2-msg-type标头指定的类型。

因此,如果您在应用程序域中提供了匹配的具体类,那么您可以拥有一个实现IHandleMessages<IEmployee>IHandleMessages<ILightEmployee> - 或IHandleMessages<object>的处理程序,因为该处理程序与所有传入的消息在多态上兼容。

Jil序列化程序是特殊的,因为如果找不到它应该反序列化的.NET类型,它将反序列化为dynamic

这意味着这个处理程序:

public class HandlesEverything : IHandleMessages<object>
{
    public async Task Handle(dynamic message)
    {
         // .... woohoo!
    }
}

与Jil序列化器配合使用,可以动态处理所有消息,挑选出感兴趣的部分。

我希望答案给人一种Rebus的一些可能性的印象。请告诉我更多是否有一种情况,你觉得这种情况不是很好。