Наследовать от абстрактного класса в WCF, не выставляя этот класс - PullRequest
2 голосов
/ 17 августа 2010

У меня есть различные классы, которые я хочу представить как сложные типы в WCF, поэтому я добавляю атрибуты [DataContract] и [DataMember] по мере необходимости для этих типов и свойств.

Однако, если я хочу, чтобы они наследовали от абстрактного базового класса (например, Person наследует от абстрактного EntityBase), я получаю ошибку, что тип "не может наследовать от типа, который не помечен с помощью DataContractAttribute или SerializableAttribute". 1003 *

Проблема в том, что если я добавлю атрибут [DataContract] в базовый класс, то этот базовый класс будет доступен клиенту через WSDL. Думаю, это не так уж и сложно, но я бы предпочел, чтобы мой клиент не знал о моей внутренней реализации.

Если я добавлю атрибут [Serializable] в базовый класс, то сначала он будет работать (его можно сериализовать, но в WSDL нет ссылки на EntityBase), но теперь, если я добавлю какие-либо свойства в EntityBase, он будет также жалуются, что его свойства не сериализуемы. (Например, я добавляю ICollection, а затем получаю ошибку, что RuleViolation не сериализуем).

К сожалению, похоже, что нет аналога [IgnoreDataMember] для типа [Serializable] ([NonSerialized применяется только к полям, а не к свойствам).

Итак, в основном я хочу объявить этот базовый тип, но не нужно, чтобы его члены были сериализованы; Есть ли способ настроить это в WCF, чтобы клиент не видел этот базовый тип?

Ответы [ 2 ]

1 голос
/ 17 августа 2010

Вы пытались вообще не отмечать свои сущности [DataContract] и [DataMember] (чтобы использовалась сериализация по умолчанию), а вместо этого отмечать свойства базового класса [IgnoreDataMember]?

У вас всегда есть несколько вариантов, и я боюсь, что вам не понравится ни один из них.

  • Создание набора объектов DTO и преобразование объектов в DTO. Как правило, это лучший метод, если вы хотите скрыть свою внутреннюю реализацию.
  • Создайте суррогатный класс (реализуйте IDataContractSuroggate) для каждой сущности, чтобы у вас был контроль над сериализацией - я не уверен, избежит ли это проблемы.
  • Обновление до .NET 4.0 и использование EF с классами POCO (без EntityBase в качестве родителя)

С уважением, Ладислав

0 голосов
/ 17 августа 2010

Я думаю, что вы должны использовать атрибут KnownType. Например, см. Проблемы WCF с KnownType для словаря

[РЕДАКТИРОВАТЬ] Более полное обсуждение этой проблемы и ее решения можно найти здесь: WCF: интерфейсы, общие сведения и ServiceKnownType

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...