В чем разница в WCF при использовании KnownType и ServiceKnownType? - PullRequest
23 голосов
/ 16 марта 2010

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

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

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

1 Ответ

41 голосов
/ 16 марта 2010

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

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

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

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

...