2010-03-16 55 views
21

我有一个服务,返回一个动物数组,但列表可以包含猫,狗等,这一切都可以扩展动物。我知道我需要分别使用KnownType或ServiceKnownType属性,以及实体类或服务类。使用KnownType和ServiceKnownType时,WCF有什么区别?

2个属性之间有什么区别?我更喜欢使用ServiceKnownType,因为它在服务上应用,恰好在需要和需要的地方,而不是在我的实体上应用的KnownType。对我来说,将它应用于实体类意味着知道我的实体类如何被使用。

现在我已经把它放在我的实体上了,它的功能就像是一种魅力,但我在这里寻找最佳实践和有用的指导。

回答

39

他们最终做同样的事情 - 但在不同的范围。

[ServiceKnownType]为此服务上的所有方法或服务上的单个方法(取决于您放置该属性的位置)定义了一个类层次结构。因此,在这种情况下,此类型层次结构仅适用于此服务,或者可能只是该服务合同中的单个方法。

[KnownType]做同样的事情 - 但基础数据合同。任何将使用此数据合约的服务现在也“继承”所有这些潜在的后代类 - 这可能会或可能不是您想要的。

所以真的 - 这只是你想要应用给定声明的范围的问题 - 将它放在数据合同上使其成为“全局”类型的hiearchy,而使用[ServiceKnownType]则允许您定义有效的仅适用于一个服务合同,或者甚至仅仅是该服务合同中的一个(或几个)方法。

+0

谢谢。这就是我的想法,我将把它放在操作合同层面。 – 2010-03-16 17:25:47

+0

顺便说一句 - 我将马特的答案标记为接受的答案是因为他提供的链接更深入。尽管我确实喜欢你的回答 - 用较少的话说。 – 2010-03-16 17:27:41

+0

看起来像其他答案被删除.... – 2017-01-30 10:27:05

相关问题