2009-07-15 38 views
2

WCF DataContract類這更多的是一種哲學/最佳實踐排序問題而不是技術問題。與方法

是否有反對與寫作是方法DataContract類中的任何有力的論據,以僅用於服務器端?或者沒有用DataMember屬性修飾的其他屬性呢?

例如:

[DataContract] 
public class LogEntry 
{ 
    [DataMember] 
    public string Message { get; set; } 
    [DataMember] 
    public string Severity { get; set; } 

    public string SomeOtherProperty { get; set; } 

    ... 

    public void WriteToDatabase() 
    { 
    ... 
    } 
} 

沒有這樣做似乎是非常多的,我寧願避免額外的工作,雖然使用擴展方法可以更容易。 但是,作爲一個優秀的開發人員,我想知道,如果它是不好的做法,這樣做。

+1

這是http://stackoverflow.com/questions/1121020/datacontracts-with-behavior的精確副本 – 2009-07-15 18:24:52

+0

謝謝,在做我的研究時沒有看到那個人。 似乎沒有一個有效的答案,但我贊成保持DataContract的清潔。 我非常喜歡從DataContract派生類的想法,因爲它比擴展方法更靈活,也可以添加其他屬性。 – jeanml 2009-07-15 18:36:46

回答

1

你當然可以添加任何你想要的類型,因爲就WCF而言,只有明確加入爲DataMembers的成員纔是合約的一部分,並且將被序列化。

我認爲它更清潔而不是將無關的成員放入合同中,因爲當您使用該類型時可能會造成混淆。

0

其實,這真的取決於上下文

的情況下我的意思是: 一是項目管理方面:資金預算/時間/ developpers水平/預期壽命項目 然後WCF上下文的時間:它是一個Web服務(wsdl)或指定的管道傳輸

如果您對所有事情都很缺乏,並且您不希望任何人比您正在開發的客戶端連接到Web服務,並且您覺得使用此方法可以實現舒適。

在所有其他情況下,我會建議乾淨拆分實現細節協定代碼。

注意,在WCF namedpipe情況下,你可能有意只實現一次由客戶端和服務器共享的組件合同。 在這種情況下,你的風險暴露給服務器的客戶端簽名。

3

從技術上講,你可以用數據合同在同一個類中添加的實現。只有歸屬的屬性纔會被序列化。

在你的榜樣,你有對象,運輸和如何寫入數據庫中同一類:

[DataContract] 
public class LogEntry 
{ 
    ... 

    public void WriteToDatabase() 

我會建議你前端代碼和對象得到序列化是從持久性分開。我甚至會建議一個單獨的數據庫訪問層,它不知道它上面的層或層的責任,它擁有傳輸和業務邏輯。

如果數據庫持久性數據中的合同和傳輸層,隨着時間的推移,這將是不可能梳理出,如果你需要更換層 - 這將是一個代碼斑點。

分離層還有助於測試。能夠在沒有完整系統的所有依賴的情況下測試代碼單元是有價值的。例如,如果您將您的數據庫持久性,甚至與界面分離的,單元測試你的業務邏輯,你可以更換一個子集在內存中執行的持久性。

一個問題就是如果你不知道被傳輸的對象,就把這些對象傳遞給DAL。爲了強制分離,我已經看到了一個類型的dll,它只包含這些帶有數據合同裝飾的結構,一個擁有transport的服務層和一個引用類型dll的BLL/DAL。

希望有所幫助。