Использование наследования в масстранзите
Допустим, у меня есть следующая структура:
public class Parent
{
public string Id;
}
public class FirstChild:Parent
{
public string FirstName;
}
public class SecondChild:Parent
{
public string LastName;
}
И у меня есть две службы, связывающиеся через метод обмена сообщениями Запрос / Ответ.
Моя первая служба отправляет сообщение и ожидает либо FirstChild, либо SecondChild в качестве ответа, поэтому я сделал следующее:
var client = bus.CreateRequestClient<CommandType, Parent>(serviceAddress, TimeSpan.FromSeconds(50));
var response = await client.Request(command);
Проблема заключается в том, что ответ отправляется от второй службы, содержащей Id и FirstName/LastName, но получает первая служба, содержащая только Id.
Как я могу переопределить эту проблему?
1 ответ
Составьте свои классы, а не наследуйте их.
В целом предпочитаете композицию наследованию?
По большей части это приведет к большей гибкости и простоте обслуживания кода.
Поэтому, вместо того, чтобы наследовать родителя, составьте его следующим образом:
public class FirstChild
{
Parent parent {get; set;}
string firstName {get; set;}
}
Таким образом, вы утверждаете, что FirstChild "имеет-родитель", а не FirstChild "является-родитель".
Я считаю, что в этом и заключается ваша проблема.
Документация MassTransit справедливо предостерегает от использования наследования в сообщениях. Не путайте дизайн вашего сообщения с дизайном OO. Сообщение только состояние без поведения.