为什么在MassTransit中强烈建议使用消息协定的接口?

Edg*_*oks 10 c# masstransit event-bus

MassTransit声明我们应该使用接口来进行消息合同:

强烈建议根据多年来不同开发人员经验水平的经验,使用接口进行消息合同.MassTransit将为消息创建动态接口实现,确保消息合同与消费者的清晰分离.

来源:文档»使用MassTransit» 创建消息合同

使用POCO DTO而不是接口有什么缺点,在使用MassTransit进行消息传递的上下文中,接口与类之间的明显优势是什么?

另一方面,NServiceBus适用于POCO,确保不使用域对象等内部类是有意义的,见下文.

来源:NServiceBus»消息传递»消息,事件和命令

创建消息时,应遵循以下准则:

  • 消息应该是简单的POCO对象.
  • 消息应尽可能小.
  • 消息应满足单一责任原则.
  • 用于其他目的的类(例如域对象,数据访问对象和UI绑定对象)不应用作消息.

Sii*_*aas 1

虽然与 MassTransit 没有直接关系,但我想说原因是封装。使用 setter 创建一个简单的 POCO,但将其传递到仅承诺 getter 的接口后面,将数据封装在 DTO 中。

public class Program
{
    static void Main(string[] args)
    {
        User user = new User()
        {
            Username = "user99"
        };

        Account account = new Account(user);
    }
}

public interface IUser
{
    string Username { get; }
}

public class User : IUser
{
    public string Username { get; set; }
}

public class Account
{
    private IUser user;

    //Currently used in main
    public Account(User user)
    {
        user.Username = ""; //This is allowed            
        this.user = user;
    }

    //But consider this ctor
    public Account(IUser user)
    {
        //user.Username = ""; //Not allowed
        this.user = user;
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 通过 POCO 方法,您可以使用带有构造函数参数的不可变类并获得相同的保证。JSON.NET 支持通过构造函数参数进行反序列化,非常简单。并且可以减轻客户端的实施负担。 (3认同)