В чем разница в WCF при использовании KnownType и ServiceKnownType?

У меня есть служба, которая возвращает массив животных, но список может содержать кошек, собак и т. д., которые все расширяют животное. Я знаю, что мне нужно использовать либо атрибут KnownType, либо атрибут ServiceKnownType, а также класс сущности или класс обслуживания соответственно.

В чем разница между двумя атрибутами? Я предпочитаю ServiceKnownType, потому что он применяется к службе именно там, где это необходимо и требуется, в отличие от KnownType, который применяется к моей сущности. Для меня применение его к классу сущностей означает слишком далекое знание того, как используется мой класс сущностей.

На данный момент он у меня есть на моем объекте, и он работает как шарм, но я ищу здесь руководство относительно лучших практик и полезности.


person Community    schedule 16.03.2010    source источник


Ответы (1)


В конечном итоге они делают то же самое, но в другом масштабе.

[ServiceKnownType] определяет иерархию классов для всех методов в этой службе или один метод в службе (в зависимости от того, где вы поместите атрибут). Таким образом, в этом случае эта иерархия типов будет действительна и применима только для этой службы или, возможно, даже только для одного метода в этом контракте службы.

[KnownType] делает то же самое, но с базовыми контрактами данных. Любая служба, которая будет использовать этот контракт данных, теперь также «наследует» все эти потенциальные классы-потомки, которые могут быть или не быть тем, что вам нужно.

Так что на самом деле - это просто вопрос того, к какой области вы хотите применить данное объявление - помещение его в контракт данных делает его своего рода "глобальной" иерархией типов, а использование [ServiceKnownType] позволяет вам определить что-то, что действительно только для одной службы контракт или даже только один (или несколько) методов в этом сервисном контракте.

person Community    schedule 16.03.2010
comment
Спасибо. Это то, о чем я думал, и я собираюсь выразить это на уровне операционного контракта. - person Paul Speranza; 16.03.2010
comment
Кстати, причина, по которой я отметил ответ Мэтта как принятый, заключается в предоставленной им ссылке, которая более подробно описывает его. Хотя мне нравится ваш ответ - он говорит об этом меньше слов. - person Paul Speranza; 16.03.2010