是否为抽象类的所有派生类型的KnownType?

时间:2011-06-07 14:03:57

标签: .net wcf abstract-class known-types

我们有一个抽象类,它是我们通过WCF服务发送的许多不同请求的基础。这是一个丑陋的恶意黑客,每当我们添加新请求时,我们必须记住将[KnownType]属性添加到此基类。

有没有办法告诉DataContractSerializer将此抽象类型的所有派生都视为KnownType

3 个答案:

答案 0 :(得分:8)

我在WCF服务中遇到了同样的问题,并且做了以下“不那么令人发指”的黑客来解决已知的类型限制。我只是为了显示备用选项而概述,由您来决定它是否更好。

  1. 在服务启动时,通过反射加载要公开的类型。例如。如果所有暴露在WCF的实体都派生自一个公共抽象基础(或更多),则从它们应该所在的程序集中加载所有类型。出于性能原因静态缓存这些类型。

  2. 创建一个静态方法,返回所述缓存类型,并带有以下签名: public static IEnumerable<Type> GetKnownTypes(ICustomAttributeProvider provider)

  3. 使用以下属性标记WCF接口 [ServiceKnownType("GetKnownTypes", typeof(StaticClassThatCachesTypes))]

  4. 这应该让您自动公开所有类型的从您选择的基类派生出来,只要未来的开发人员将它们放在正确的位置即可组装

答案 1 :(得分:2)

除了Dan C.给出的另一个选项是切换到NetDataContractSerializer - 它不需要已知的类型声明,因为它与精确的合同实现紧密耦合,所以你需要共享包含客户端和服务器之间类型的程序集 - 在这种情况下,您肯定会失去互操作性。有一些关于这样做的帖子(我经常在google / bing结果中看到this one)。

答案 2 :(得分:-1)

Here是使用PostSharp执行此操作的示例。看看帖子的底部。