4

このサービス契約を解除する必要がある場合:

[ServiceContract(Namespace="http://api.x.com/Svc1")]
public interface IService1
{
   [OperationContract(Name = "AddCustomer")]
   bool AddCustomer(DTOCustomer1 customer);
}

これに:

[ServiceContract(Namespace="http://api.x.com/Svc1")]
public interface IService1
{
   [OperationContract(Name = "AddCustomer")]
   bool AddCustomer(DTOCustomer2 customer);
}

そしてこの良い記事によると:WCFのバージョン管理データコントラクトが変更された場合、新しい名前空間で新しいvs ofデータコントラクトを定義し、次に新しい名前空間で新しいvs ofサービスコントラクトを定義し、その後新しいエンドポイントを定義する必要があることを理解しています追加する必要があります。

私はこれをどの程度正確に行うと思いますか。どこかに例はありますか?上記の私のサービス契約に基づいて何かを書いていただけませんか?

前もって感謝します!

4

2 に答える 2

4

リンクされた記事によると、次のようなことを行う必要があります。

[ServiceContract(Namespace="http://api.x.com/Svc1")]
public interface IServiceNew : IService1
{
   [OperationContract(Name = "AddCustomerNew")]
   bool AddCustomer(DTOCustomer2 customer);
}

次に、それをサービスに実装します。

public class MyCurrentServiceImplementation : IServiceNew 
{...}

サービスを再デプロイする必要がありますが、既存のクライアントは引き続きAddCustomer操作を呼び出すことができ新しいクライアントはAddCustomerNew操作を呼び出すことができます。

于 2012-01-10T18:58:12.920 に答える
3

あなたがあなたの投稿で述べている仮定に注意することは非常に重要です:

「データコントラクトが変更された場合、新しい名前空間で新しいデータコントラクトとデータコントラクトを定義する必要があります」

常に正しいとは限りません。データコントラクトの変更が破損せず、したがって、サービスメソッドの内部実装を変更して特定のデータの有無を処理する以外のアクションを必要としない場合については、MSDNの「データコントラクトのバージョン管理」を参照してください。データ契約バージョン間の違い。

この特定の例では、呼び出されたメソッドの2つのバージョンがAddCustomer、新しいサービスインターフェイスの作成を正当化するほど、その意図が大きく異なる可能性があることを疑問視します。新旧のデータ契約を見ないとわかりませんが、ここでの本当の問題は、追加の顧客情報を受け入れるようにメソッドが進化したことだと思います。

それが本当なら、それはメソッド呼び出しのオプションの引数の状況に非常によく似ています。WCFは、データコントラクトに対する中断のない変更として、このシナリオを非常にうまく処理するように設計されています。MSDNの「ベストプラクティス:データコントラクトのバージョン管理」のガイドラインに従うことができる限り、コントラクトの古いバージョンまたは新しいバージョンのいずれかを提供する呼び出しは、既存のサービスインターフェイスで問題なく受け入れられます。サービスメソッドは、クライアントとサーバーのデータコントラクトの組み合わせで可能なデータを取得します。

サービスインターフェイスの一貫性、シンプルさ、クリーンさを維持し(つまり、IServiceNewのようなことは避けます)、代わりにデータコントラクトに追加し、受信するデータAddCustomerに適応するように実装を変更します。

于 2012-09-13T20:23:16.817 に答える