在公共交通中使用继承

Using Inheritance in Masstransit

假设我有以下结构:

public class Parent
{
    public string Id;
}

public class FirstChild:Parent
{
    public string FirstName;
}

public class SecondChild:Parent
{
    public string LastName;
}

我有两个服务通过 Request/Response 消息传递方法进行联系。

我的第一个服务发送一条消息并期望 FirstChild 或 SecondChild 作为响应,所以我所做的是:

var client = bus.CreateRequestClient<CommandType, Parent>(serviceAddress, TimeSpan.FromSeconds(50));
var response = await client.Request(command);

问题是响应是从包含 Id 和 FirstName/LastName 的第二个服务发送的,但由仅包含 Id 的第一个服务接收。

如何解决这个问题?

撰写您的 类 而不是继承它们。

总的来说,组合优于继承Prefer composition over inheritance?

在大多数情况下,它会使代码更灵活、更易于维护。

因此与其继承父级,不如像这样组合它:

public class FirstChild
{
   Parent parent {get; set;}
   string firstName {get; set;}
}

通过这种方式,您是在声明 FirstChild 'has-a' 父级而不是 FirstChild 'is-a' 父级。

我相信这就是您的问题所在。

MassTransit documentation 正确地警告不要在消息中使用继承。不要将消息设计与 OO 设计混淆。消息只有状态没有行为。