WCF第二章契約データ契約バージョン

6317 ワード

変化は避けられない.企業の変化、技術の変化、法律の変化、ソフトウェア契約も変わります.ソフトウェアの変更に直面するときは、堅牢なバージョン管理が必要です.既存のクライアントを後方互換化しながら、避けられない変化に備えなければなりません.
データ契約バージョン管理では、既存のデータ契約にメンバーを追加する必要があります.このセクションで説明した絶え間ない説明により、既存のクライアントを破壊することなく、自由に変更することができます.しかし、既存のクライアントの後方互換性を破る必要がある場合は、データ契約の名前やネーミングスペースを変更することで、別のバージョンのデータ契約を定義する必要があります.
小さな注意は絶え間ない変化に注意することです.絶え間なく、WCFの標準から見ると、他のシステムとの互換性を破る可能性があります.たとえば、メタデータ検証を要求するシステムと通信する場合、受信したXMLインスタンスに予期せぬ要素がある場合、メッセージを拒否する可能性があります.この章で述べた無停止期間とは、WCFからWCFへの通信の変化に影響を及ぼさないことを意味する.
 
絶え間なく変わる
2つのタイプの変更は、既存のクライアントの互換性を破ることはありません.
  1. 必要でない新規メンバーの追加
  2. 既存の必須でないデータ・メンバーの削除
どちらの場合も、新規または欠落した必須でないデータ要素を簡単に無視することで、新しいメッセージから既存のタイプを作成できます.逆に、既存のタイプから新しいメッセージを作成することもできます.DataContractSerializerは、実行時にこれらを自動的に処理します.
 
途切れた変化
データ契約で特定の水洗いを変更し、後方互換性を保証することができますが、非常に多くの要素の変更は既存のクライアントに影響します.データ契約の定義に次のいずれかの変更を加えた場合、現在のクライアントは正常に動作しません.
  1. データ契約の名前またはネーミングスペースを変更する
  2. 以前に必須だったデータ・メンバーの名前変更
  3. 新しいデータ・メンバーを追加し、その名前は以前に使用したものと同じです.
  4. 既存のデータ・メンバーのデータ型を変更
  5. DataMemberAttributeにIsRequired=trueの新しいメンバーを追加
  6. DataMemberAttributeでIsRequired=trueの新しいメンバーを除去
 
リスト2.24は、2つのデータ契約定義を示している.第1の定義はサービスV 1にあり、第2の定義はV 1サービスの別のバージョンV 2にある.V 1とV 2の違いに注意して、データメンバーCurrencyが削除され、DailyVolumeが追加されます.この変化は途切れない.
 
リスト2.24データ契約の無停止変更-データメンバーの追加と削除

    
      
[DataContract(Namespace = " http://EssentialWCF " )]
public class StockPrice // V1
{
[DataMember]
public double CurrentPrice;
[DataMember]
public DateTime CurrentTime;
[DataMember]
public string Ticker;
[DataMember]
public string Currency;
}

[DataContract(Namespace
= " http://EssentialWCF " )]
public class StockPrice // V2
{
[DataMember]
public double CurrentPrice;
[DataMember]
public DateTime CurrentTime;
[DataMember]
public string Ticker;
[DataMember]
public int DailyVolume;
}

既存のクライアントでは、新しいデータ・メンバーが追加されても正常なデータ転送を行うには、元のデータ契約が拡張性をサポートする必要があります.すなわち,元のデータ契約は将来の未知のデータのシーケンス化をサポートしなければならない.これにより、1つのクライアントがV 2のデータをV 1に送信し、V 1を再びV 2に返信することができる.WCFのデフォルトはsvcutilである.exeが生成したエージェントコードは拡張性を実現する.この機能をサポートしたくない場合は、サービスプロファイルのServiceBehaviorセクションにを追加することで無効にできます.
 
リスト2.25は、GetPriceを呼び出してStockPriceオブジェクトを取得し、StoreStockPriceに送信するクライアントコードを示す.svcutilを通過すると仮定する.exeが生成したStockServiceのエージェントは、V 1サービスを指し、リスト2.24のV 2サービスに更新される.クライアントがV 2サービスを実行すると、GetPriceメソッドはDailyVolumeメンバーが追加され、Currencyオブジェクトが削除されたXMLに戻されます.データ契約逆シーケンス化器は、V 1 StockPriceオブジェクトを理解し、DailyVolumeメンバーをV 1オブジェクトのExtensionDataメンバーに配置し、Currencyメンバーの損失を示すことはありません.このクライアント・コードは、予想されるStockPriceオブジェクトを受け入れます.Currencyがデフォルト値に初期化され、全体的なオブジェクトが少し「重い」ことがわかります.これは、クラスに追加の拡張データ(DailyVolume)が表示されるためです.このように、サービスは、正当なV 2データを送信し、クライアントがどのデータからなる正当なV 1サービスを使用するかを同時に送信する.
 
リスト2.25は、V 1契約を使用してV 2サービスを呼び出す

   
     
localhost.StockServiceClient proxy = new localhost.StockServiceClient();
localhost.StockPrice s
= proxy.GetPrice( " msft " );
proxy.StoreStockPrice(s);

==========
転載先
作成者:
DanielWise
出典:
http://www.cnblogs.com/danielWise/