2

In my project I'm using repository pattern for business-layer. Reading alot about repository pattern I haven't found any information on how to keep business objects synchronized with data.

Lets say I've loaded some data, through mapping created my business objects and saved them to repository. My repository implementation maintains change tracking so I can easily update underlying data layer.

The application is n-tier application with multiple clients, and (possibly) multiple business layer instances on different independent servers.

The problem:
How to maintain data consistency between business objects in repository and respective data in database?

Is there any patterns or best practices on when and how to update business objects who's data was changed in database while they are cached in repository?

4

1 に答える 1

0

一度に 1 つの Aggregate Root (AR) を処理する場合、リポジトリはその AR に関連するすべてのものをトランザクション (またはコミット) でラップする必要があるため、物事は簡単です。問題は、永続性がトランザクションをサポートしていないときに、複数の AR や鉱石を処理する場合です。

その場合の解決策は、結果整合性の概念(別名、物事は一貫性があります... 最終的に)、メッセージ駆動型アーキテクチャ、サガ、べき等性に慣れている必要があるため、少し注意が必要です。

簡単に言えば、1 つ以上のイベントを生成する 1 つの Ar が更新されます。もう一方の AR は、これらのイベントをサブスクライブし、それらの状態を更新するだけでなく、他のイベントを生成します。インフラストラクチャ (この場合はメッセージ バス) により、各イベントが少なくとも 1 回発行されることが保証されます。問題が発生する可能性がありますが、メッセージ バスは最終的にメッセージを配信します (ただし、まったく同じミリ秒ではありません)。

イベント ハンドラーの冪等性により、最初の結果を変更せずに操作を繰り返すことができるようになります。一方、サガはイベントのフローと可能なコマンド (イベントの結果として) を管理します。

そのため、関連するすべてのビジネス オブジェクトは最終的に同期されますが、それを達成するには少し時間がかかります (1 ミリ秒から数分、数時間へ)。

簡単で簡単ではありませんが、それほど難しくはなく、ローカルおよび分散シナリオの両方で非常に便利です。

分散アプリの場合、NServiceBusを使用できます

于 2012-11-28T09:41:18.810 に答える