Как обрабатывать Dtos для объектов, которые реализуют несколько интерфейсов?
Мы используем Dtos в нашем интерфейсе службы WCF, но начали сталкиваться с проблемами, когда бизнес-объект, который представляет Dto, реализует более одного интерфейса, и мы хотим вернуть Dtos в этих различных контекстах, а также иметь возможность обрабатывать Дтос полиморфно на клиенте.
Например, допустим, у нас есть интерфейс дляIBusinessObject
с несколькими свойствами, содержащими детали отношений объекта, атрибутов объекта и т. д. и т. д. У меня есть несколько реализаций этого, являющегосяLinearBusinessObject
которые реализуютIBusinessObject
а такжеILinear
, Есть и другие реализацииILinear
которые не являются также бизнес-объектами, просто линейными вещами.
У нашего сервиса есть способ получить бизнес-объект. Это возвращает базовый класс Dto (BusinessObjectDto
) который объявляет общие частиIBusinessObject
(атрибуты отношений и т. д.) иLinearBusinessObjectDto
который расширяетсяBusinessObjectDto
и добавляет дополнительную информацию о линейной стороне вещей. Это нормально и позволяет клиенту обращаться с возвращеннымиBusinessObjects
с некоторой степенью полиморфизма.
Мы также хотим метод, который получает линейную вещь. Это возвращает базовый классLinearDto
который содержит общие линейные детали. Простая линейная реализация объекта расширяетLinearDto
и все хорошо. Но теперь у меня есть проблема, так как я не могу иметьLinearBusinessObjectDto
простираться от обоихLinearDto
и иBusinessObjectDto
поскольку поддерживается только одиночное наследование, и я не могу использовать интерфейсы, так как WCF не знает, какие типы затем включить в определения контракта на обслуживание в WDSL.
Итак, я начал получать 2 dtos для моегоLinearBusinessObject
тот, который происходит отBusinessObjectDto
(LinearBusinessObjectAsBusinessObjectDto
) и тот, который происходит от LinearDto (LinearBusinessObjectAsLinearDto
), а затем конвертировать каждый на основе интересующего меня интерфейса.
Похоже, это приведет ко многим дополнительным классам Dto (которых у меня уже много), и поэтому мне интересно, есть ли лучшее решение, чем это? Или это просто то, с чем мы должны жить?