Как обрабатывать Dtos для объектов, которые реализуют несколько интерфейсов?

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

8
задан Sam Holder 7 March 2012 в 10:08
поделиться