0

因此,我创建了几个 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>哪些元素实际上是 type 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.. }
   }
}
4

1 回答 1

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.. }
  }
}
于 2012-11-28T21:45:01.717 回答