9

現在のプロジェクトにリポジトリ パターンを使用しようとしています。現在、ドメインをモデル化し、集約ルートを見つけようとしています。

ルートが削除されたときにメンバーを削除する意味がない場合は、ルートの一部であってはならないという「Cascading Delete」ルールを読みました。

例として警察の事件を使用します:-

インシデント (集約ルート) - これには、調査担当者、各担当者によって作成されたメモが含まれる場合があります。また、インタビューされた日付のリストとともに容疑者を含めることもできます。事件の CCTV 映像は取得されましたか? CCTV が閲覧された各時間のログと誰が? 証拠/裁判所などのためにCCTVのコピーが作成されましたか

すべてがそのインシデントにかかっているように見えるため、IncidentAggregate が巨大になる可能性があるようです。

私の質問は 2 つあります。集約ルートはどの程度管理する必要があるか、およびルート内のルートは良い考えですか?

おそらく警察の事件のようなものを削除することはおそらくないので、これは特に良い例ではないかもしれませんが、私の質問をよりよく説明していることを願っています.

4

3 に答える 3

10

集約には、通常、他の集約ルートへの参照が含まれています。これらの参照は、含まれている集計が削除されたときに削除する必要がありますが、参照先の集計はそのまま残ります。

あなたの類推を使用するには。レポートは 1 つのインシデント集計のみの一部であり、集計と共に削除されるものと想定します。これらのレポートに直接アクセスする他の集計はありません。

ただし、インシデント集計は、警官、容疑者、および CCTV 閲覧ログ エントリを表す集計を参照します。

于 2010-01-22T15:09:21.760 に答える
9

集約は、同じライフサイクルを持つオブジェクトのグループです。

インシデントを削除した場合、捜査官も削除しますか? いいえ、そうすると、すぐに警官がいなくなります。捜査官はインシデント集計に含まれていません。

あなたがリストする他のもの、容疑者、インタビュー、CCTVなどについて。答えは、場合によって異なります。

問題のドメインによって異なります。あなたのシステムは何をしていますか?その範囲は何ですか?それはどのような問題を解決していますか?

一連のインシデントを追跡することが唯一の仕事であり、容疑者、インタビュー、および CCTV が単一のインシデントの結果としてシステム内にあると仮定する場合、はい、それらすべてを 1 つの集計に含めることが適切な場合があります。事件が削除された場合、容疑者、インタビュー、CCTV は移動できます。

たとえば、市内中心部のカメラのネットワークから収集された CCTV 映像のアーカイブも追跡するとします。多分あなたはそれらの有効性と信頼性を監視しようとしています. その場合、CCTV の映像を別の方法で処理する必要があります。独自のライフサイクルを持つ別の集約になります。インシデントを削除しても、他のインシデントやパフォーマンス メトリックのために CCTV 映像を保持したい場合があります。

集計に含まれるものと含まれないものは、問題のドメインによって異なります。より正確には、問題領域のソリューションをモデル化した方法に依存します。

ライフサイクルを考えてください。

于 2010-01-25T21:51:33.650 に答える
1

「ルート内のルートは良い考えですか?」

私の意見では、短い答えはノーです。Kurt が言うように、他の集計への参照を保持する必要があります。明確にするために、参照とはオブジェクトを識別することを意味します。したがって、おそらくインシデント集計には次のようなプロパティがあります

public IEnumerable<Guid> InvestigatingOfficerIds 
{ 
    get { return _investigatingOfficerIds.AsReadOnly(); }
}

または

public IEnumerable<OfficerReference> InvestigatingOfficerIds 
{ 
    get { return _investigatingOfficerIds.AsReadOnly(); }
}

ここで、OfficeReference は役員 ID の値を表すクラスです (内部ではおそらく Guid になります)。

ドメイン ロジックでインシデントと調査担当者の両方を使用してアクションを実行する必要がある場合は、このロジックをドメイン サービスに抽象化し、IOfficerRepository を使用して、インシデント集計で提供された ID を使用して担当者集計をフェッチします。

于 2011-02-08T17:07:39.530 に答える