Подтвердить что ты не робот

KnownType для всех производных типов абстрактного класса?

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

Есть ли способ сказать DataContractSerializer рассматривать ВСЕ производные этого абстрактного типа как KnownType?

4b9b3361

Ответ 1

У меня была такая же проблема в службе WCF, и я сделал следующий "менее отвратительный" взлом для работы с известным типом ограничений. Я излагаю только для того, чтобы показать альтернативные варианты, это зависит от вас, чтобы решить, лучше ли это или нет.

  • При запуске службы загрузите через отражение типы, которые вы хотите открыть. Например. если все ваши объекты, связанные с WCF, получены из общей абстрактной базы (или более), загрузите все типы из сборки, в которую они должны быть расположены. Кэшируйте эти типы статически по соображениям производительности.

  • Создайте статический метод, который возвращает указанные кешированные типы со следующей подписью: public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)

  • Отметьте интерфейс WCF следующим атрибутом [ServiceKnownType("GetKnownTypes", typeof(StaticClassThatCachesTypes))]

Это должно дать вам автоматическое выявление всех типов, которые являются или будет, полученным из базового класса (ов) по вашему выбору, если будущий разработчик помещает их в правильные сборка.

Ответ 2

Другим вариантом, помимо Дана С., является переход на NetDataContractSerializer - он не требует известных объявлений типа, поскольку он тесно связан с точной реализацией контракта, поэтому вам нужно разделить сборку, которая содержит типы между клиентом и сервером, - и вы обязательно потеряете функциональную совместимость в этом сценарии. Есть несколько сообщений об этом (я видел, что этот часто появляется в результатах google/bing).

Ответ 3

Здесь приведен пример этого с помощью PostSharp. Посмотрите на нижнюю часть сообщения.