2009-11-09 92 views
0

尋找WCF服務的一些指導原型。WCF:使用只讀成員對複雜對象進行序列化

我有一個WCF服務託管在IIS中,將數據傳遞給我的客戶端。我有一個單獨的共享程序集,其中包含我的WCF項目中引用的所有業務對象。

我想在這些業務對象中只有一些屬性是隻讀的,因爲我不希望我的客戶能夠在其客戶端代碼中更改這些字段。

我讀到[DataContract]屬性的裝飾類強制正確的序列化來維護只讀字段,但是當我實現它時,客戶端中生成的代理類顯示爲可寫。

是否有任何技巧可以實現這個目標?

謝謝!

/埃裏克

回答

1

你可以使用普通的屬性,與DataMember屬性標記他們,使set訪問私有:

 [DataMember] 
     public object IsFoo 
     { 
      get 
      { 
       return _isFoo; 
      } 
      private set { } 
     } 

編輯:此外,要真正防止你的類的用戶設置該屬性,你可以總是拋出一個InvalidOperation異常。

+0

所以我嘗試了這條路線(下面),但是當我進入客戶端並使用代理對象工作時,我仍然可以「設置」值。 私人字符串strAdUrlTec; [DataMember] public string AdUrlTec { get { return strAdUrlTec; } private set {} } – Eric 2009-11-09 19:05:11

+0

你是如何設置屬性的?並從那裏 - 它是在擁有班級?如果它在外面,你應該得到一個編譯錯誤! – 2009-11-09 19:06:31

+0

我不是從擁有的課程設置它。我有一個WCF服務項目,該項目反映了我的業務對象所在的外部程序集(特別是我們正在討論的那個程序集)。我有一個使用WCF服務的單元測試項目。所以在我的單元測試中,我從WCF服務中取出一個對象,然後更改AdUrlTec屬性,它讓我。上週我看到了另一個線程,提供了相同的解決方案,所以我認爲你是對的,但我想知道爲什麼我的實現不尊重私有設置者。 :( – Eric 2009-11-09 19:13:28

0

根據我的經驗,我發現,WCF序列化,只有很簡單對象模型很好地工作。如果您計劃通過網絡傳遞業務或域對象,則可能需要考慮在「傳輸」對象中創建站點。這個對象可以讓你控制你的消費者正在接收什麼,並且可以映射回你的域對象。