在公共交通中使用继承
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 设计混淆。消息只有状态没有行为。
假设我有以下结构:
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 设计混淆。消息只有状态没有行为。