WCF Наследование / Полиморфизм и Сериализация - PullRequest
3 голосов
/ 05 мая 2009

У меня есть класс ReportDef, который является конкретным классом, который я при необходимости украсил атрибутами [DataContract] и [DataMember]. ReportDef находится в сборке A1 вместе с моими ServiceContract, IReportService. Затем у меня есть другой класс, UiReportDef, который наследуется от ReportDef и находится в сборке A2. UiReportDef не имеет дополнительного состояния, о котором заботится служба.

Я хочу вызвать мой сервис с экземпляром UiReportDef. Есть ли какой-нибудь способ (кроме ручного создания экземпляра ReportDef из UiReportDef), чтобы сделать это без того, чтобы мой сервис знал о A2? Я знаю о KnownType. Я не хочу ссылаться на A2.


РЕДАКТИРОВАТЬ: Вот некоторый контекст, который может сделать мой вопрос легче понять. My ServiceContract реализует IReportService, который определяет метод, RunReport(ReportDef report). ReportDef украшен атрибутом DataContract и имеет закрытых членов, украшенных DataMember. UiReportDef находится в сборке, которая зависит от сборок, связанных с пользовательским интерфейсом и т. Д. Я не проектировал существующую иерархию классов. Мне нужно передать ReportDefs и UiReportDefs (как ReportDefs) на новый сервис. Поскольку ReportDef является конкретным, я ожидаю, что сериализатор будет обрабатывать UiReportDefs как ReportDefs при отсутствии какой-либо другой информации.

Ответы [ 3 ]

2 голосов
/ 05 мая 2009

Я не понял вашего вопроса.

Но я думаю, что теперь я понимаю часть этого, вы хотите десериализовать объект в сборке, на которую нет ссылки?

Если это так, вы не можете, если вы не готовы много размышлять и не будете определять / ссылаться на него как на «объект»

Обычный способ сделать это, и я пытался объяснить в моем предыдущем ответе, что вы должны использовать интерфейс, на который могут ссылаться оба клиента / сервера.

В этом случае обычной практикой является создание сборок-заглушек, состоящих только из интерфейсов.

Или, как подсказывает ваш комментарий к вашему вопросу, вы можете использовать объекты DTO. http://en.wikipedia.org/wiki/Data_Transfer_Object

1 голос
/ 08 сентября 2009

Эта ветка, вероятно, может сильно помочь: Наследование WCF и DataContract

0 голосов
/ 05 мая 2009

WCF не полиморфен, потому что не объектно-ориентирован. Следовательно, это невозможно.

...