2012-08-29 33 views
0

是否有任何開關指示svcutil使用代碼中定義的名稱生成DataContract屬性?例如,當我創建一個使用代理以下DataContract使用svcutil生成代理期間的DataContract屬性名稱

[DataContract(Namespace = "http://schemas.mynamespace.com/2012/08")] 
public class MyDataContract 
{ 
    [DataMember(IsRequired = true, Order = 0)] 
    private int _id; 

    public int Id 
    { 
     get { return _id; } 
     set { _id = value; } 
    } 
} 

我得到這個DataContract上的代理生成的類:

public partial class MyDataContract : object 
{     
    private int _idField; 

    [System.Runtime.Serialization.DataMemberAttribute(IsRequired=true)] 
    public int _id 
    { 
     get 
     { 
      return this._idField; 
     } 
     set 
     { 
      this._idField = value; 
     } 
    } 
} 

DataMemberAttribute的順序屬性始終中省略,以及對前3個屬性和MessageContract省略了IDisposable實現。

回答

1

好了,我不能省略order評論,但是我或許可以幫上休息:

  • 通常在屬性上指定DataMember屬性,而不是在字段上。數據合同本身不屬性和領域區分,但它知道的名稱,類型,如果是強制性的,等等,等等

  • 補充:什麼Chris表示:隨着[DataMember(Name="whateveryouwant")],你就可以設置與字段/屬性名稱不同的名稱。儘管如此,我不喜歡這種用法,但它在重構代碼時仍然有用,但仍然保持API兼容。

  • 只有其他DataContract(和一些本質上支持的)類型被序列化到/來自消息。 IDisposable似乎不是一個。

  • 序列化MessageContract的遺傳IDisposable沒有任何意義。消息合約是SOAP消息的.NET表示形式。除了在SOAP消息XML和可訪問的.NET類型之間提供1:1映射外,沒有別的可做的事情了。

    消息是ServiceContract的一部分,它指定哪種消息必須發送到某個操作才能成爲有效的調用,而另一個(響應)消息協定指定操作返回的數據的方式,將結構化。沒有其他的;它是一個數據聚合。

如果你想捕捉的客戶機上的服務操作的結果,爲方便起見,在走出去的範圍內自動發送信息回(或例如從服務註銷),你將不得不在客戶端實現這一點。但請注意,服務不得要求要求這種情況發生(由於連接丟失,崩潰等)。

+0

啊,對。這在WCF關於IDisposable實現的原則中也有規定。愚蠢的我,不去想它。 雖然這是首選方式,但關於'Property'的名字?只有公共'Properties'可以應用'DataContractAttribute'而不使用私有字段,或者保留私有字段並直接在'Property'上應用attr? – Pantelis

+0

另一個想法是,自'Attribute'應用到'Property'上後保留私有字段是沒有意義的,是嗎? – Pantelis

+1

我建議使用簡單的自動屬性。爲什麼?我上次檢查時,WCF無法使用完全不可變的DataContract類型,而不變性是自己寫出私有(只讀)字段的最常見原因(當然還有其他一些,如緩存魔法等)。 – gimpf

1

使用name屬性上的DataMember屬性

如:

[DataMember(Name="myname")] 
相關問題