2011-10-28 9 views
1

WCFのバージョン管理について、ネットでいくつかの記事を読んでいます。ここではカップルです:
WCF Versioning Guidelines
MSDN: Versioning Strategies単一のクライアント、複数のサーバー環境で使用する契約バージョンポリシー

さて、私は一種の契約のバージョン管理についての基本を理解するが、これらの記事のすべてが(もちろん)です主に対象の環境があります一つのサーバと多数のクライアントとクライアントサーバーよりも古い可能性があります。

私の場合、これは逆の方法ですが、1台のクライアントと多数のサーバーです。これは、複数のワークステーション、つまりwcfサーバーと通信できる1つのアプリケーションサーバー(クライアント)を持つ環境が原因です。
クライアントには常に最新のバージョンがあり、サーバーには古いバージョンが含まれている可能性があります。

私は、サーバーでサポートされているバージョンを取得し、それに従ってクライアントで正しい契約を選択し、実際のサービスコールを行うために、別のサービス(または同じサービスにGetVersionメソッドを実装する)を計画しました。

ここで質問があります。このシナリオでは、laxバージョン管理を使用していますか、または厳密な変更を行う必要があります。

答えて

0

「サーバープッシュ」をしていますか?つまり、固定IPハードウェアがクライアントとして動作し、動的IPマシンがServiceHostを実行していますか?

ここでバージョン管理を行う「スマートレイヤー」があればいいと思うけど、本当に魔法の弾丸はありません。 IExtensibleObjectは実際にはラウンドトリップのためのデータを維持するだけですが、サーバーに古い契約がある場合は、古い実装しか持たないため、この '拡張'情報を '使用'できません。

あなたが従うことができる練習がいくつかあります。主な違いは、バージョン番号を変更する、またはしない... WCF契約の場合は、バージョン番号はありませんが、バージョンは契約名前空間/ URIにエンコードされます。

名前空間を変更しないと、基本的に「私はサービスを1つしか持たないでしょう。メソッドを変更したり削除したりしないように厳密な開発方法を実装する必要があります。追加だけが可能です。これにより、クライアントはサーバーがもはや理解できない要求を送信できなくなります。

もう1つの方法は、契約の各リビジョンでWCF契約URI /名前空間を変更することです。あなたは「サーバー」に、あなたがサポートしたい契約の各バージョンを実装します。たとえば、3つ前のバージョンの顧客をサポートしている場合、最新のWCFサーバーを実行している可能性がありますが、WCFクライアントは3つ以上のバージョンであってはなりません。また、WCFサーバーは要求を理解しません(URI /名前空間は存在しません)。 これは通常私が選択するアプローチです。絶対に必要な それぞれの新しい契約は、新しい名前空間を受信したときに

はこれを行うために、私は

  1. WCFは、これは非常に静的で コントラクト階層的なアプローチを持っている、唯一の変更/ URI 契約から継承しません以前のバージョン - そうすることで、機能の非難を防ぐことができます。

  2. WCFサービスインプリメンテーション このインプリメンテーションは、単なるSHIMレイヤーです。要求を受け取り、適切なロジックレイヤーに渡します。

  3. ロジック層/アダプタ ロジック層/アダプタ 要求が最新バージョンの契約書に達した場合、すぐに処理されます。 要求が以前のバージョンの契約で到着した場合、そのバージョン用のアダプタが存在します(これは実際にはサービス実装で可能です)。要求がアダプタに渡されます。

アダプターは古い要求を受け取り、次の新しいバージョンの名前空間に適合させる責任があります。これは連鎖方式で動作しますので、例えば、要求はv1.0のクライアントから受信した場合、バージョン1.3サーバーへ

1.0 contract -> 
    1.0 to 1.1 adapter -> 
     1.1 to 1.2 adapter -> 
      1.2 to 1.3 adapter -> 1,3 implementation. (and back if not one-way) 

各アダプタは、によって処理するための要求を準備し実行する機会を持っています次のバージョン。 たとえば、1.1メソッドでは、 '要求日'の要件が渡されている可能性がありますが、「最適な推測」ができることがわかっているので、その引数を1.0アダプタに追加してから1.1論理への要求。

「仮定されていない」または「デフォルトになっていない」要件を導入することは可能ですが、これは契約上の変更を打ち破ることであり、絶対に必要な場合にのみ行うことを望みます。しかし、あなたは契約を結ぶことができないので、しばらくの間、両方の方法をサポートし、古い契約をサポートから落とすことができ、古い方法はすべて消えます。

次に、ロジック契約とは独立してバージョン管理される別の名前空間にエンティティを分離することもできます。もう一つの魚の釜。

また、古い契約をサポートする期間を決める必要があります。サポートしている時間が長くなればなるほど、「バージョン管理」ロジックがより複雑になります。上記のようなインプリメンテーションでこのロジックを連鎖させることは、特定のバージョンのアダプタレイヤーを作成した後に再訪する必要はありません。

うまくいけば、これはあなたに何か考えてもらいたいと思っています。

関連する問題