2010-10-25 35 views
9

我有一個WCF服務的類,可以叫它AA是一個數據合同,它包含作爲其DataMembers之一的另一個自定義對象集合B。爲了避免客戶端上的空引用的問題,我實例化BList在構造函數中,像這樣:我是否需要在WCF DataContract中公開一個構造函數以使其在客戶端上的對象實例化過程中工作?

[DataContract] 
public class A 
{ 
    [DataMember] 
    public String name { get; set; } 
    [DataMember] 
    public List<B> BList {get; set; } 

    public A() 
    { 
     BList = new List<B>(); 
    } 
} 

我的問題是,在客戶端上,這個實例化沒有發生,BList出現後爲空在客戶端上創建的對象A。我猜測構造函數沒有出現在客戶端上。那麼,我是否需要使構造函數成爲明確的操作合同?如果這樣會使客戶看到內部的東西,他們不應該看到,對嗎?我如何確保這個實例化發生在客戶端上?

謝謝,對不起,如果這似乎是一個愚蠢的問題。

回答

2

我不知道是否有一種方法可以做到這一點,但通過從列表中應初始化的服務獲得新的情況下,我建議以下

  • 編寫返回一個新實例的Web方法你的類,你可以使用它作爲下面,我相信你的列表被初始化

創建實例:

A a = new ServiceClient.CreateAInstance(); 

在服務編寫方法,

[OperationContract] 
public A CreateAInstance() 
{ 
    return new A(); 
} 
+0

謝謝。這可能會起作用,但會讓客戶調用一個web方法來實例化一個對象,從而給客戶帶來負擔。 – 2010-10-26 17:52:30

3

您需要使用[OnDeserializing]或[OnDeserialized]屬性做DataContract類型的初始化。見http://msdn.microsoft.com/en-us/library/ms733734.aspx

+0

對不起,剛纔看到問題比這個更深 - 你希望BList初始化的*行爲轉移到客戶端。不幸的是,這樣做沒有可互操作的方式(XSD/WSDL/etc不允許描述這樣的語義),但你當然可以共享類型(例如,將你的類型放入MyDataContracts.dll並執行svcutil /r:MyDataContracts.dll )如果您不介意打破解決方案的真正解耦/ SOA特性...... – 2010-10-26 00:33:21

相關問題