Dot-Net

WCF:公開只讀 DataMember 屬性而不設置?

  • December 9, 2009

我有一個伺服器端類,我通過 [DataContract] 在客戶端提供它。此類有一個只讀欄位,我想通過屬性使其可用。但是,我無法這樣做,因為似乎不允許我在沒有 get 和 set 的情況下添加 [DataMember] 屬性。

那麼 - 有沒有辦法在沒有 setter 的情況下擁有 [DataMember] 屬性?

[DataContract]
class SomeClass
{
   private readonly int _id; 

   public SomeClass() { .. }

   [DataMember]
   public int Id { get { return _id; } }        

   [DataMember]
   public string SomeString { get; set; }
}

或者解決方案將使用 [DataMember] 作為欄位 - (如此處所示?也嘗試過這樣做,但它似乎並不關心該欄位是只讀的..?

編輯:是通過像這樣破解它來製作只讀屬性的唯一方法嗎?(不 - 我不想這樣做……)

[DataMember]
public int Id
{
   get { return _id; }
   private set { /* NOOP */ }
}

實際上,您的“伺服器端”類不會對客戶端“可用”。

發生的情況是這樣的:基於數據契約,客戶端將從服務的 XML 模式創建一個新的獨立類。它本身不能使用伺服器端類!

它將根據 XML 模式定義重新創建一個新類,但該模式不包含任何 .NET 特定的東西,如可見性或訪問修飾符 - 畢竟它只是一個 XML 模式。客戶端類將以這樣一種方式創建,即它線上路上具有相同的“足跡”——例如,它基本上序列化為相同的 XML 格式。

不能通過標準的基於 SOAP 的服務“傳輸”有關該類的 .NET 特定知識 - 畢竟,您傳遞的只是序列化消息- 沒有類!

檢查“SOA 的四個原則”(由 Microsoft 的 Don Box 定義):

  1. 邊界是明確的
  2. 服務是自治的
  3. 服務共享模式和契約,而不是類
  4. 兼容性基於策略

請參閱第 3 點 - 服務共享模式和合同,而不是類 - 您隻共享數據合同的介面和 XML 模式 - 僅此而已 - 沒有 .NET 類。

引用自:https://stackoverflow.com/questions/1873741