Dot-Net
WCF:公開只讀 DataMember 屬性而不設置?
我有一個伺服器端類,我通過 [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 定義):
- 邊界是明確的
- 服務是自治的
- 服務共享模式和契約,而不是類
- 兼容性基於策略
請參閱第 3 點 - 服務共享模式和合同,而不是類 - 您隻共享數據合同的介面和 XML 模式 - 僅此而已 - 沒有 .NET 類。