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データ契約の無停止変更-データメンバーの追加と削除
既存のクライアントでは、新しいデータ・メンバーが追加されても正常なデータ転送を行うには、元のデータ契約が拡張性をサポートする必要があります.すなわち,元のデータ契約は将来の未知のデータのシーケンス化をサポートしなければならない.これにより、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サービスを呼び出す
==========
転載先
作成者:
DanielWise
出典:
http://www.cnblogs.com/danielWise/
データ契約バージョン管理では、既存のデータ契約にメンバーを追加する必要があります.このセクションで説明した絶え間ない説明により、既存のクライアントを破壊することなく、自由に変更することができます.しかし、既存のクライアントの後方互換性を破る必要がある場合は、データ契約の名前やネーミングスペースを変更することで、別のバージョンのデータ契約を定義する必要があります.
小さな注意は絶え間ない変化に注意することです.絶え間なく、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/