10

ORM が取り込まれているドメイン プロジェクトをセットアップしました。ドメインには、それぞれ独自のルート オブジェクトを持つさまざまな集約が含まれています。私の質問は、集約境界を越えるプロパティをどのように扱うべきですか?

  • これらのプロパティは境界を単純に無視して、境界付けられたコンテキスト A のドメイン オブジェクトがコンテキスト B のオブジェクトへの参照を持つようにする必要がありますか?
  • または、コンテキスト A から B への直接リンクはなく、コンテキスト A のオブジェクトには、B 集約ルートを介して B からドメイン オブジェクトを取得するために使用できる「int ContextBId」プロパティがありますか?
  • または ...

例:
コンテキスト A = ユーザー
コンテキスト B = ゲーム

Usersコンテキスト内には object がありますUserOwnedGamesUserこのオブジェクトには、同じUsersコンテキスト内のオブジェクトへの参照であるプロパティがあります。オブジェクトには、Game明らかにユーザーではなくGamesコンテキスト内にある へのプロパティもあります。

この関係はどのように見えるでしょうか (またはあるべきでしょうか?)。データベース (つまり 2 つの外部キー) では明らかですが、コードはどのように見えるでしょうか?

4

4 に答える 4

17

UserコンテキストにもGameエンティティが必要なようです。ただし、これは必ずしもコンテキストGameのルートであるエンティティと同じではないことに注意してください。これら 2 つの境界付けられたコンテキストは、aとは何か、およびそれが持つプロパティについてGame異なる考えを持っている可能性があります。GameID だけが 2 つの Game オブジェクトを結び付けます。

User Context
{
    Aggregate Root User
    {
        Identity;
        Name;
        OwnedGames : List of Game value entities
    }

    Value Entity Game
    {
        Identity;
        Name;
    }
}

Game Context
{
    Aggregate Root Game
    {
        Identity;
        Name;
        Owner : User value entity
        HighScore : int
        TimesPlayed : int
        ... A whole bunch of other properties which are not relevant in the User context
    }

    Value Entity User
    {
        Identity;
        Name;
        // No OwnedGames property, in this context we don't care about what other games the user owns.
    }
}
于 2013-09-12T13:55:34.920 に答える
4

BC 間での DB 参照を避ける必要があります。異なる BC (トランザクション) からの集約間の参照整合性を保証しようとしないでください。理想的には、トランザクションは BC ではなく、単一の集約内にのみ存在する必要があります。

ID に単純な値オブジェクト (UserId と GameId) を使用し、必要に応じてそれらをエンティティに割り当てることをお勧めします。このようにして、これらの「リモート」エンティティは完全に分離されるため、それらの接続について心配する必要はありません。同期は、メッセージング プラットフォームを使用して実装できます。

暇があれば、これらの貴重な記事 (Vaughn Vernon 著) を読んでください。

于 2013-09-12T13:31:07.080 に答える
0

BC は論理的な分離として考える必要があります。BC は、人々がどのようにグループ化され、各チーム間の関係が存在するかを示しています。そうは言っても、ユーザーとゲームを単一の境界付けられたコンテキストに保持し、一緒にする必要があるものをまとめることを検討できるかもしれません。大きな青い本からのこの素晴らしいビデオ秘伝のレッスンを参照してください

于 2021-10-20T04:53:59.893 に答える