6

私はすでに答えを知っているのではないかと思いますが、誰かがこれまでに見つけられなかった代替の解決策を提供できることを望んでいます。いつものように、効果的な骨材設計に従ってDDDを実行することは、私が思っていたよりも難しいですが、これが私のシナリオです。

  • UserとRoleGroupの2つのARがあります
  • ユーザーには特定のRoleGroupを付与できるため、そのロールグループ内のRoles(コレクション値オブジェクト)によって提供されるアクセス許可を取得できます。ロールグループのIDは、別のVAとしてユーザーARに保持されます。
  • RoleGroupがシステムから削除されると、ハンドラーがそのRoleGroupを参照しているすべてのユーザーを検索し、参照を削除するために使用するドメインイベントが発生します。対応するプロジェクションデノーマライザーは、同じイベントを使用して、ユーザーの有効な役割を更新します。これは、そのユーザーに付与された個々のロールと、付与されたすべてのロールグループのロールの組み合わせです。
  • これはトランザクションである必要はありません(結果整合性が得られるようになりました)。
  • JonathanOliverのEventStore3.0と、Lokad.CQRSおよびNCQRSの要素を使用したイベントソーシングを使用します。

したがって、理論的には、1つの要求(ASP.NET MVCアプリ)が上記のシナリオを実行しているときに、別の要求が同じRoleGroupをユーザーに付与している可能性があります。上記のドメインイベントハンドラーがそのRoleGroupに関連するユーザーをスキャンした直後にそれが発生した場合、その要求は完了します。その時点で、(物理的ではありませんが)削除されたRoleGroupと、そのRoleGroupのIDを保持しているユーザーがいます。

これをどのように防ぎますか?現在、RoleGroup ARの特定のRoleGroup部分を付与されたユーザーのIDを作成することを検討しています。これにより、RoleGroupを削除してユーザーに付与すると、楽観的同時実行性の競合が発生します。しかし、どういうわけか、これは正しい解決策のようには感じられません。

4

3 に答える 3

1

なぜRoleGroup参照をUser集計に追加するのですか?この情報を使用するユーザーの不変条件はありますか?

RoleGroupアグリゲートを介してRoleGroupをユーザーに付与し、RoleGroupGrantedToUserイベントのようなものを発行することで、これをはるかに簡単にモデル化できると思います。RoleGroupが削除されると、RoleGroupRemovedイベントが発行されます。このイベントの後、RoleGroupは新しいユーザーを受け入れなくなります。

于 2012-11-29T13:15:08.073 に答える
1

これは、一意性の制約を解決する方法と似ています。

SERIAL動作を持つロールグループとユーザーの両方を含む予測があるとします。ロールグループがアーカイブされると(つまり、使用できなくなると)、プロジェクションの上部にあるリアクティブビットは、そのロールグループを付与されたすべてのユーザーに、ロールグループの一部ではなくなったことを通知できます。このアーカイブされたロールグループがユーザー(またはセット)に同時に付与されると、プロジェクションのシリアル性を利用して、このユーザーにもグループの一部ではなくなったことを通知できます。

とはいえ、これは単なるハウスキーピングです。正しいビューが重要になるのは、ロールグループとユーザーが慣れたときだけです。ロールグループはIsArchivedビットを持っていると思うので、自動化された方法で解決する必要があることを証明する必要があるぶら下がっているエッジケースを心配することなく、その時点で安全にフィルターで除外できます。

余談ですが、イベントログをスキャンすると、この状況も明らかになります。つまり、その時点より前(またはその前後)にアーカイブされたロールグループを付与されたユーザーはいますか?管理者は、ユーザーアグリゲートに補正コマンドを発行することでこれを解決できます。

「状況次第」TM

編集:私はこの問題に対する技術的な解決策を与えました。私は他の読者に、これらの種類の問題をモデル化して解決するさまざまな方法を探求することをお勧めします。時々、おそらくほとんどの場合でさえ、答えはまったく技術的ではありません。YMMV。

于 2012-11-29T14:01:49.353 に答える
0

これを防ぐには、トランザクションにすることができます。つまり、何らかのロックメカニズムによって削除されたRoleGroupをユーザーに付与できないようにすることができます。しかし、それは物事を複雑にするだけであり、あなたが指摘したように、必須ではありません。

RoleGroupをユーザーに割り当てる場合、ユーザーの有効な役割も更新するための同様の射影非正規化機能があると思います。付与されたRoleGroupがその時点でまだ存在するかどうかを確認し、存在しない場合は、ユーザーから参照を削除します。そうすれば、ユーザーの効果的な役割は最終的に一貫しているはずです。

于 2012-11-29T13:07:09.587 に答える