質問

並行性の競合をアプリケーションレイヤーと通信する場合、の原則を尊重する例外を使用する代替手段がありますか コマンドクエリ分離, 、または例外は、私たちが持っている最良のメカニズムですか(例外をサポートする言語で)?

アプリケーションの腸には、特定の高レベルのメソッドを呼び出すときにいくつかのレイヤーを実行する楽観的なロックロジックがあります。 ORMの実装がこれを行う方法を聞く)。アプリケーションがこのように見えることを相互作用する高レベルのメソッド呼び出し:

// 'data' is just a placeholder for multiple parameters, including something
// that contains row version information
void Customer.UpdateInformation(object data);

他の誰かが取り組んでいるデータを更新したときに、Webアプリケーションをユーザーに伝えることができる必要があります。

データを変更するメソッドから値を返さないでください。したがって、過去には例外をスローしました(.NETデータアダプターAPIと同様に、 dbconcurrencyException 競合を検出した場合)が、同時実行競合は、いくつかの常識的な方法では例外的ではありません。それらは人生の事実です。アプリケーションのワークフローの予測可能で予想される部分です。彼らはとして資格がありますか 外因性の例外, 、エリック・リパートの分類法で?

役に立ちましたか?

解決

私の意見では、例外はこの種のエラーを伝えるための最良の方法です。プレゼンテーションレイヤーでキャッチできる特定の種類の例外を投げるので、あなたのソリューションは非常に正しいと思います。プレゼンテーションレイヤーは、その例外の情報を使用してユーザーに表示できます。

例外が最良の方法ですが、優れたユーザーエクスペリエンスを作成するのは非常に難しい場合があります。最も簡単なことは、ユーザーに競合があることを伝え、変更を失いたいか、新しい変更をオーバーライドしたいかどうかを選択することです。競合を表示したり、ユーザーにオーバーライドする値と違反を選択させたりすると、難しくなります。または、少なくとも、これを一般的な方法で行うことは非常に困難です。競合が発生する可能性のあるシステム内の各画面のこのような競合を解決するために、特定のインターフェイスが必要になる可能性があります。

私が取り組んだシステムでは、ユーザーへの表示のためにこれらの例外をほとんどキャッチしなかったわけではありません。私たちは、その背後にあるプロセスを変更することにより、これらの競合が発生するのを防ぐことを主にしようとしました。もちろん、アプリケーションの種類と、ビジネスの仕組み(または機能するのが好き)に完全に依存します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top