2012-11-28 31 views
0

因此,我創建了幾個WCF服務。每個返回列表中的某種類型的數據合同。但是,這些數據合同具有其他數據合同的列表屬性。我正試圖實現延遲加載數據合同集合。在WCF中使用DataContract代理

我想過的是在客戶端實現一個類,該類繼承了具有集合屬性的數據契約,並且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

有關如何做到這一點的任何建議?

謝謝!

編輯:樣品數據對象類:

[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.. } 
    } 
} 

回答

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.. } 
    } 
}