Мы используем Dtos в нашем интерфейсе службы WCF, но начали сталкиваться с проблемами, когда бизнес-объект, который представляет Dto, реализует более одного интерфейса, и мы хотим вернуть Dtos в этих разных контексты, а также иметь возможность полиморфно обрабатывать 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 (которых у меня уже много), поэтому мне интересно если есть лучшее решение, чем это? Или это просто то, с чем нам приходится жить?