2010-12-27 30 views
0
  1. 私はこのインターフェイスをサーバーでDCに実装しません。IExtensibleDataObjectが前方互換性と後方互換性を達成しました

  2. 私はこの実装を自動的にクライアントでVS2008によって生成されましたが、これは問題ありません。

  3. 今私は(特定のサービスメソッドのサーバーDC(のInputParameter)を微分)に行くと、新しいフィールドを含めるように私のReference.csを編集

  4. コンパイルは、それが動作しますが、古いサービスを指しているコードを実行します私の値を無視して、新しいフィールドの値を設定します(例のブール型をtrueに設定します)。

  5. なぜ私は前方互換性を期待していますし、それだけで正常に動作しているDC

  6. のためにサーバーに実装する必要があります。

  7. #3で追加したコードを削除しました。コンパイル。

  8. 代わりに、同じフィールドをサーバーDCコンパイルに追加しました。

  9. 私は、クライアントからサーバへのより少ないデータを送信するコードを実行し、DCにはさらに多くのカラムがあります。それはうまく動作しています。これは下位互換性が問題なく動作していることを意味しますか?

  10. 私の理解が正しくないところもありますか?

私の環境

は、.NET 3.5 SP1

答えて

1

IExtensibleDataObjectが異なるためであるです。

[DataContract] 
public class MyObject 
{ 
    [DataMember] 
    public string MyMember { get; set; } 
} 

[ServiceContract] 
public class MyService 
{ 
    [OperationContract] 
    public MyObject Operation(MyObject object) 
    { 
    object.MyMember += " modified"; 
    return object; 
    } 
} 

操作が変更されたパラメータを返すことが予想されます。

今、あなたは、クライアント上のデータコントラクトを変更することとします

var client = new MyServiceClient(); 
var myObject = new MyObject 
    { 
    MyMember = "Member", 
    MyNewMember = "Some value" 
    }; 

MyObject returnedObject = client.Operation(myObject); 

サービスのデータコントラクトはIExtensibleDataObjectを実装していないと、それは知りません。

[DataContract] 
public class MyObject 
{ 
    [DataMember] 
    public string MyMember { get; set; } 
    [DataMember] 
    public string MyNewMember { get; set; } 
} 

は今の操作を呼び出すことができますMyNewMemberプロパティについてどの値がreturnedObject.MyNewMemberにありますか? nullになります。しかし、サーバ側でIExtensibleDataObjectを実装すると、サーバがこのプロパティについて何も知らなくても、「ある値」になります。

+0

私の順方向および/または下位互換性を達成するのに役立つ方法は私の質問ですか? http://bloggingabout.net/blogs/vagif/archive/2009/03/29/iextensibledataobject-is-not-only-for-backward-compatibility.aspx http://stackoverflow.com/questions/3434015 – sahridhayan

+0

私の答えとあなたが提供したリンクに基づいて、IExtensibleDataObjectの実装が必要なときはすでに理解しているはずです。サービス契約にデータラウンドトリッピングの操作が含まれていない場合は、IExtensibleDataObjectは必要ありません。 –