Использование наследования в масстранзите

Допустим, у меня есть следующая структура:

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. Сообщение только состояние без поведения.

Другие вопросы по тегам