背景Webサービス更新メッセージ(DTO)でオプションの属性を使用する方法は?
は図書館で本を管理し、BookService
、あなたは(SOAP)、Webサービスがあるとします。情報モデルでBook
エンティティは以下の属性を持っていることを前提としています。データを操作するために
id
author
publisher
title
shelfId
4ウェブサービスオペライオンが定義される:
AddBook
GetBook
UpdateBook
DeleteBook
要求および応答メッセージは、各操作のために定義されています。しかし、更新メッセージXMLスキーマの設計はより複雑です。
- R1:属性の以前の値をリセット/削除する可能性があります。など。あなたはその本を図書館に保管することはもうなくなり、その特定の本の属性
shelfId
の属性値をリセット/空にして削除したいとします。 - R2:ウェブサービスの不快感を避ける。anti-pattern Chatty Servicesを参照してください。
- R3:並行性制御とオプティミスティック・ロックに関する将来の要件を準備します。古い情報に基づいて更新が行われるリスクを最小限に抑える(または削除する)ことをお勧めします。
設計案
私は更新メッセージ(複数可)を設計するために、1は、いくつかのサブオプションを持っている3つの市長の選択肢を、以下を参照してください。
- が全体のビジネス文書を送ります。明示的にヌルに設定された要素(スキーマ内に
minOccurs="0"
を持つ)、つまり<shelfId xsi:nil="true"/>
が削除されたと解釈されます。 - 変更を強調表示するか、差分のみを送信してください。
- ビジネス文書全体を送信しますが、この目的に固有の属性を使用して変更された要素をマークします。例:
<author dirty="true">Hemingway<author/>
。サービスのプロバイダは、dirtyとマークされた要素のみを更新し、他の要素は無視します。 - メッセージスキーマでは、識別子が
id
のすべての要素にminOccurs="0"
を設定します。消費者は、のみを変更する要素に送信します。削除された要素は、ではなく、意味的には削除と解釈されなければなりません()。値を削除するには、明示的なXMLNULL
値を使用する必要があります。例:<shelfId xsi:nil="true"/>
。 - ビジネス文書全体を送信するだけでなく、以前に読み取った文書のコピーを送信します。プロバイダは、2つのドキュメントを比較して、の属性のみを更新して、新しいドキュメントと以前のドキュメントが異なる属性を指定できます。
- ビジネス文書全体を送信しますが、この目的に固有の属性を使用して変更された要素をマークします。例:
- 複数の操作を定義します。
UpdateBook
という操作を1つだけ使用する代わりに、更新する必要があると思われる要素に基づいて複数の操作を定義します。UpdateBookAuthor
,UpdateBookPublisher
など。これらはそれぞれ必須の要素のみを持ち、要素の削除には明示的なXMLのNULLを使用します。<shelfId xsi:nil="true"/>
。
考察
Altキー3を理解することは簡単であるという利点があるが、欠点はBook
エンティティ内の複数のフィールドを更新する必要がある場合には、消費者が複数の操作を呼び出す必要があるだろうということです。これにより、サービスは "chatty"になり(上記のR3を参照)、パフォーマンスが低下します。
はアルト2はアルト1よりも複雑であるが、オプティミスティック並行性制御に関するアルト2のいくつかの利点がある:各々のタイムスタンプ/バージョンの状況について
- は楽観的ロックフィールドがデータベースに格納されている(例:
authorVersion
)=>Alt 2は、author
とpublisher
のように、複数のユーザーが異なる部分を同時に変更する方法を提供します。これは、同じBook
障害が発生する危険性が少なくなります。全体Book
ための1つのタイムスタンプ/バージョンのオプティミスティック・ロックをアルト2 1アルト上のデータベース=>本当の利点に格納されている状況で - 。更新で1つのフィールドのみが変更されても、要求のバージョン番号が古すぎると障害が発生します。状況では
- なし同時実行制御や楽観/悲観的ロックが使用されている=>Altキー2は、古いデータを上書きするのAltキー1より少ないリスクを与えるが、それでも他の一貫性のない変更が問題を与えることがあります。
でアルト2(及びアルト3)さらに別の状況があるがアルト1上の利点を与えます。コンシューマは、Book
エンティティに関するすべてのデータを保存することはできません。例えば、棚の情報を更新するときに、著者が棚の情報を追跡(キャッシュ)する必要がなければ、棚から書籍を選ぶロボットをより効果的にプログラミングすることができる。
消費者がバージョン番号またはタイムスタンプの代わりに以前のバージョンのコピー全体を提出するAlt 2.3のアプローチの利点は、バージョン番号またはタイムスタンプにデータベース内の専用の列が必要ないということです。
これをまとめて言えば、Alt 2.2は、ほとんどの場合、最も魅力的なように見えます。ここでの課題は、XMLをデシリアライズするフレームワークが、明示的にNULLに設定された要素(例えば、要素)と左上の要素を区別できる必要があることです。 <shelfId xsi:nil="true"/>
。 See a post on this topic here.
あなたがのために行くだろう選択肢のQUESTION
?あなたは他のより良い選択肢を見ますか?ディスカッションについてどう思いますか?