10

2つの集約ルートと1つの通常のエンティティの単純な例のドメインがあります。 TenantUserGroupおよびUserこの特定のサンプルのどこで、2つのAggregateRootsTenantを補います。User

UI /サービスレイヤーからコマンドを受信すると、書き込み専用ドメインを操作するコマンドハンドラーに到達します。

これはAggregateRootUserであるとはまったく考えられていませんが、他のユーザーから参照されるため、通常のエンティティにすることはできません。(はい?)

これらの2つのAggregateRootsは通信する必要があります。の制限付きコンテキスト内のエンティティである、にUser属さずにAを作成することはできません。おそらく、単純な制約であるため、コンストラクターを介してユーザーを作成できます。UserGroupTenantUser.Create(TenantId, UserGroupId)

DomainEvent(ユーザーの)with Date、AggregateVersion、およびAggregateIdを生成します。次に、ぼやけた部分に行きます。

このイベントをストアにコミットすると、このイベントはバス(メモリなど)にブロードキャストされます。これは、コマンドハンドラーと同様に、ドメインのイベントハンドラーが作成されたユーザーをキャッチし、通知/操作してTenantUserGroupを追加するポイントUserIdです。

これを解決することについての私の考えは完全に間違った方向に進んでいますか?

4

1 に答える 1

7

ASagaはあなたが探しているものかもしれません。

簡単に言うと、サガは、特定のイベントをリッスンし、さまざまな集約ルートに、またはコンテキストの境界を越えてコマンドを発行するイベントハンドラーとして実装できます。

あなたの場合、それはこのように見えるかもしれません:

public class RegisterUserSaga : Handles<UserCreated>
{
    public void Handle<UserCreated>(UserCreated evnt) {
        var tenantId = // you probably know how to find this
        var groupId =  // same here
        var command = new RegisterUserForTenant(evnt.UserId, tenantId, groupId);
        Bus.Send(command);
    }
}

Rinat Abdullinによるこの記事でサガの詳細を読むか、「CQRS、競合状態、およびサガ-オーマイ!」をご覧ください。ウディ・ダーハン

アップデート:

コメントでの詳細な議論の後、これが別の角度からどのように機能するかを示します(疑似コードを先に)。これにより、考えられる解決策にさらに光が当てられることを願っています。

// Aggregates:

Tenant
    Guid TenantId
    List<Guid> UserGroups

UserGroup
    Guid UserGroupId
    List<Guid> Users

User
    Guid UserId
    Some more details

// Commands:

RequestRegistration(userId, userGroupId, user details)
CreateUser(userId, user details)
AddUserToGroup(userId, userGroupId)

// The initial command would be:

RequestRegistration (leading to a RegistrationRequested event)

// The Saga handles the RegistrationRequested and all subsequent events

UserRegistrationSaga 
    Handle(RegistrationRequested)
    -> send CreateUser command (which eventually leads to a UserCreated event)
    Handle(UserCreated)
    -> send AddUserToGroup command (-> UserAddedToGroup event)
    Handle(UserAddedToGroup)
    -> Done
于 2011-12-06T14:21:42.657 に答える