在WCF中使用DataContract代理

时间:2012-11-28 20:43:21

标签: wcf serialization dto

所以,我创建了几个WCF服务。每个返回列表的某种类型的数据合同。但是,这些数据合同具有其他数据合同的列表属性。我正在尝试实现数据契约集合的延迟加载。

我所想到的是在客户端实现一个类,该类继承了数据协定,并且集合属性重写,因此setter和getter方法调用服务并获取实际的集合项。

我的问题是:如何让基本渠道返回实现数据合同的类而不是实际的数据合同?如何控制基本频道返回的内容?

我的服务客户端如下所示:

public class ServiceClient : BaseClient<IServiceClient> 
{
   public IList<DataObject> FindAll() 
   {
       // how to control what base.Channel.FindAll return during deserialization.
       return base.Channel.FindAll();
   }
}

请注意,我不想做这样的事情:

public class ServiceClient : BaseClient<IServiceClient> 
{
   public IList<DataObject> FindAll() 
   {
       var dtos = base.Channel.FindAll();
       var dtoProxies = Mapper.Map<DataObject, DataObjectProxy>();

       return dtoProxies;
   }
}

我想要一种方法,以便WCF自动返回List<DataObject>哪些元素实际上是DataObjectProxy类型。

有关如何执行此操作的任何建议吗?

谢谢!

编辑:示例DataObject类:

[DataContract]
public class DataObject 
{
   public virtual List<OtherDomainObject> SubItems { get; set; }
}

public class DataObjectProxy : DataObject 
{
   public override List<OtherDomainObject> SubItems 
   {
      get { // Custom way to retrieve collection... }
      set { // Etc.. }
   }
}

1 个答案:

答案 0 :(得分:0)

首先,使用[DataContract]属性修饰DataObjectProxy,WCF要求所有类型的显式合同标识 - 无论您以后要做什么。然后,在要向客户端公开的数据协定类型的每个字段(在您的案例中为属性)上设置[DataMember]。 最后,在DataObject类上添加[KnownType(typeof(DataObjectProxy))]属性。 KnownType定义客户端上多态替换的给定基的所有子类型。 这应该有用。

[DataContract]
[KnownType(typeof(DataObjectProxy))]
public class DataObject 
{
   [DataMember]
   public virtual List<OtherDomainObject> SubItems { get; set; }
}

[DataContract]
public class DataObjectProxy : DataObject 
{
   [DataMember]
   public override List<OtherDomainObject> SubItems 
   {
      get { // Custom way to retrieve collection... }
      set { // Etc.. }
  }
}