C# 在WCF中使用自定义DataContractResolver传输涉及泛型的继承树
我有一个WCF服务,其中有接受非泛型基类作为参数的操作C# 在WCF中使用自定义DataContractResolver传输涉及泛型的继承树,c#,.net,wcf,datacontract,C#,.net,Wcf,Datacontract,我有一个WCF服务,其中有接受非泛型基类作为参数的操作 [DataContract] class Foo { ... } 这个基类又被诸如类之类的泛型继承 [DataContract] class Bar<T> : Foo { ... } [DataContract] 酒吧类别:富 { ... } 为了实现这一点,我以前必须为Foo类注册KnownTypes,并让它们包括所有可能的Bar变体(例如Bar,Bar,甚至Bar) 然而,使用.NET4中的DataContractRe
[DataContract]
class Foo
{ ... }
这个基类又被诸如类之类的泛型继承
[DataContract]
class Bar<T> : Foo
{ ... }
[DataContract]
酒吧类别:富
{ ... }
为了实现这一点,我以前必须为Foo类注册KnownTypes,并让它们包括所有可能的Bar变体(例如Bar
,Bar
,甚至Bar
)
然而,使用.NET4中的DataContractResolver,我应该能够构建一个正确存储(和恢复)类的解析器
我的问题是:
Bar`1[List`1[string,mscorlib],mscorlib]
,我错了吗?客户端上的相同DataContractResolver不能还原这些类型吗我希望这两方面都能奏效,但我不确定这是个好主意;它需要额外的配置,在Silverlight等上不起作用,但在“full.NET”上可能会起作用,每端都有相同的位。不知道DataContractResolver的典型用例是什么,但根据本文()的说法,这应该可以通过“SharedTypeResolver”轻松实现以及共享包含合同的程序集 请注意:
因此,虽然这似乎是可能的,但从设计的角度来看,我不太确定这是否是一个好主意,因为这将削弱合同的表达能力。这些类型将破坏契约并破坏与其他编程语言的兼容性,这将导致一个问题,即首先使用像SOAP这样的开放标准是否是正确的解决方案。DataContract用于不共享程序集…我以前使用过
DataContractResolver
;以下是我的发现:
`foreach (OperationDescription operation in myWCFService.Description.Endpoints[0].Contract.Operations)
{
operation.Behaviors.Find<DataContractSerializerOperationBehavior>()
.DataContractResolver = new MyDataContractResolver();
}`
`foreach(myWCFService.Description.Endpoints[0].Contract.Operations中的OperationDescription操作)
{
operation.Behaviors.Find()操作
.DataContractResolver=新的MyDataContractResolver();
}`
对于客户端,您可以执行相同的操作:
`foreach (var operation in base.ChannelFactory.Endpoint.Contract.Operations)
{
operation.Behaviors.Find<DataContractSerializerOperationBehavior>()
.DataContractResolver = new MyDataContractResolver();
}`
foreach(base.ChannelFactory.Endpoint.Contract.Operations中的var操作)
{
operation.Behaviors.Find()操作
.DataContractResolver=新的MyDataContractResolver();
}`
我的解析器从配置的位置动态加载类型,并基于某些属性缓存它们。如果您愿意,我可以提供一些示例代码-这些代码都非常基本
KnownTypeAttribute(例如,使用提供的方法返回所有已知类型)也可用;但是自定义解析器允许更灵活的方法,例如动态加载类型(例如插件系统)和进行您自己的映射(类型=>类型名称,反之亦然)Silverlight 4是否没有访问同一个DataContractResolver的权限?至于第一个问题-当然是双方