12

集計と集計ルートに苦労しています。ユーザー要求の約 60% で機能する自然な集約ルートがあります。つまり、これらのリクエストは当然集約ルートに適用されます。

集約内に、集約ルートのメンバーとしてのみ存在できる別のエンティティがあります。ただし、ユーザーには、この別のエンティティ オブジェクトについて通知されます。概念的には、ユーザーがこの非集約ルート オブジェクトを直接操作することが理にかなっている場合があります。

したがって、いくつかのオプションがあると思います。

  1. ユーザーが要求している操作に応じて、両方とも集約ルートにすることができます。
  2. すべての操作は、最上位の集約ルートを通過する必要があります。

最上位の集約ルートは、この他のエンティティのコレクションを保持することに注意してください。


例:

主な集計ルート: 車

2 番目のエンティティ: 座席 (タイプに応じて、車には 2 つまたは 4 つの座席があります)。私のドメインでは、座席は車の一部としてのみ存在できます。

ドメイン内のほとんどの操作は、自動車レベルです。したがって、これは集約ルートの良い候補になります。ただし、(ここで例を示すのに苦労しています)、SpillCoffee、ChangeFabric、Clean など、一部の操作はシート レベルになります。

Seat と Car の両方が集約ルートになることはできますか? それとも、常に Car から始める必要がありますか?

ありがとう

4

3 に答える 3

13

集約の考え方は、一貫性を保証することであり、データの整合性を担当するルートであり、不変条件を強制します。

「すべての座席の生地は同じでなければならない」または「車内に誰かがいる場合にのみ、座席にコーヒーをこぼしてはならない」などのルールがあるとします。ファブリックを個別に変更することができます。そうしないと、これらの不変条件を外側 (危険ゾーン) に強制する必要があります。

IMHO、整合性または不変条件の強制が問題にならない場合、集計は実際には必要ありません。しかし、もし必要なら、私のアドバイスは、すべてを車から始めることです。しかし、常にモデルを考えてください。このような不変条件がある場合、これらの不変条件を強制するのは誰ですか? 次に、このアイデアをコードに渡してみてください。すべてうまくいくはずです。

于 2009-06-10T17:02:55.887 に答える
2

おそらく、ドメイン モデルのいくつかの側面について、より深い知識が必要になるでしょう。この質問は、理想的には、この種の質問が実装前にすでに回答されている場合に、エンティティを編成してシステムを提供する方法を発明しようとしていることを示しています。

これがシステムの実装でのみ発生する場合は、ドメインを再確認するか、脆弱性を発見したかどうかに関係なく、フィードバックがビジネスの関連する詳細の変更を集約して、ドメインをより豊かにし、より適切にモデル化することができます。

車の例では、異なるコンテキストを関連付ける 2 つの集計のアプローチを使用しました。1 つ目は「車にはシートがある」アプローチであり、この集合体では、「シート」の可能なアクションは、「車の一部として座る」ことに意味があるものになります。例:きれい。

2 番目の集約は「座席」のコンテキストにあり、スタンドアロンとしての座席の可能なアクションと構成があります。例: ChangeFabric、ColorList。このように、集約された「車」には「座席」がありますが、クライアントは意味のあるコンテキストで座席を知ることができます。前の投稿で samuelcarrijo が言ったように、これは危険です。コンテキスト間の変更がドメインの整合性に影響を与える場合、すべての集約概念が失われます。

于 2009-06-12T18:24:06.960 に答える
1

カートと項目を含むショッピング カートの場合、それらを個別に変更することが多いため、両方を集約ルートとして使用します。

public class Cart : IAggregateRoot
{
  public List<LineItem> LineItems {get;}
}

public class LineItems : IAggregateRoot
{
  public List<LineItem> LineItems {get;}
}

ただし、注文用に別の境界付けられたコンテキストがあり、この場合、明細項目を個別に変更する必要がないため、必要な集計ルートは 1 つだけです。

public class Order : IAggregateRoot
{
  public List<LineItem> LineItems {get;}
}

もう 1 つのオプションは、子 ID から集約ルートを検索する方法を用意することです。

Car GetCarFromSeatID(guid seatID)
于 2009-06-10T17:06:48.453 に答える