2012-06-21 13 views
0

當您創建新的WCF項目時,將爲您生成樣本服務。默認的數據合同(我剛剛換了字符串類型字段標題):爲什麼數據合約中的私人字段是通過公開字段修改的?

[DataContract] 
public class CompositeType 
{ 
    bool boolValue = true; 
    string name = ""; 

    [DataMember] 
    public bool BoolValue 
    { 
     get { return boolValue; } 
     set { boolValue = value; } 
    } 

    [DataMember] 
    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 
} 

什麼是具有這些私有字段boolValue點?在合同中寫一些數據消毒或其他操作是否是一種好的做法,從而使其膨脹?這似乎是我不直接寫字段的唯一理由。那麼它是英國媒體報道還是它背後有一些原因?

回答

2

在我看來,DataContracts的奇異目的應該是在域之間傳輸數據。驗證/消毒邏輯應該在DataContract的職責範圍之外。特別是如果意圖在多個項目/平臺上共享/鏈接代碼文件以供重用。

這也意味着你不應該在你的應用程序的其他地方使用你的DataContract對象。它應該通過某種適配器或轉換器來讀/寫內容到特定於應用程序的對象。它在轉換(或您的應用程序對象),你可以做一些驗證。數據傳輸層越簡單越好。

可能的話,您可以在setters/getters(最好是臨時的)中添加日誌/調試代碼,以根據需要跟蹤數據輸入/輸出。到目前爲止,這是唯一的例子,我覺得什麼以外的DataContract對象中的簡單屬性(並且我只是暫時這樣做了)。

編輯:至於爲什麼這是默認生成的文件,我不知道。我的DataContract對象始終使用自動屬性。我建議也許這是在引入自動屬性之前.NET 2.0的倒退,但是WCF/DataContracts直到3.0才被引入。

1

您爲任何私有值編寫getter和setter的相同原因,有助於幫助封裝並允許您操作類的內部工作,而無需擔心外部成員因爲直接操作變量而破壞。

1

簡短的回答是,公共屬性允許您設計人員在將值分配給私人字段之前限制這些值,從而可能使您無法處理意外數據。雖然大多數get和set方法都是相同的,但它們通常是防止不良數據的第一道防線。

+0

好的,問題實際上是在數據合同(意味着發送它)還是**發送數據之前清理數據**。如果我在其中編寫消毒邏輯,我認爲數據契約可能會**膨脹**。所以你不同意? – Arnthor

+0

我不同意。你稱之爲膨脹,其他定義爲健全的軟件工程最佳實踐。是的,你正在添加幾行代碼,但防禦保護措施是最值得的。另外,我們不寫入ROM芯片。我們擁有處理能力,帶寬和內存,不會犧牲經濟上的堅固性。 – GrayFox374

+0

你沒有再讓我。數據**必須進行消毒,問題是數據合同還是在其他地方進行消毒。例如,它當然不是一個在.ascx文件中編寫數據清理代碼的良好工程實踐,您可以在* back-end * .ascx.cs文件中執行。 **我不是在問getters,setters或驗證。我一直在。**問題是,在哪裏做驗證。 – Arnthor