質問: DDDが想定され、C#/ EF Coreを使用している場合の解決方法がわからないという問題があります。 簡素化された状況: *Item*と*Warehouseの* 2つの集約があります。それらのそれぞれは、外部(FEなど)を識別するExternalId(Guid)によるIDを持ち、ドメインIDとしても扱われます。また、データベースモデル内でそれを識別する*データベース* IDがあります-エンティティモデルとDbモデルは、EF Coreがプライベートフィールドを使用できるのと同じクラスです-ExternalIdと必須フィールドのみが公開されています。エンティティ(DDDとEF Coreの両方の意味)には、オブジェクトに厳密に結合された非常に多くのビジネスロジックとメソッドが含まれています。一般的に、 eShop / eShopOnContainersの例のパターンに従います。 アイテムはWarehouseに割り当てられます。アイテムを作成するときには、Warehouseをコンストラクタに渡す必要があります。 完全なWarehouseオブジェクトをItemのコンストラクターに渡すのは適切ですか(Itemが定義する他のメソッドにも): ``` public Item(Warehouse warehouse,..) ``` または、データベースIDのみでリレーする必要があります: ``` public Item(long warehouseId,..) ``` 私はこれについて問題があります。一方から、集計は他の集計を参照してはならないことを読んだのですが、一方でDatbase DBを使用すると、実装の詳細(リレーショナルDBのオブジェクトパーシスタンス)がドメインモデルに漏れます意見。 ExternalIdの使用: ``` public Item(Guid warehouseId,..) ``` dbの実際の関係はそれに基づいていないため、問題を解決しません。 あなたの意見は何ですか ?私は少し困惑しています。
回答: 通常、集約ルートのIDの値オブジェクトを作成します。データベースによって生成されたIDに依存することは1つの可能性です。 DbにIdを生成させることにした場合、それを使用する必要があります。しかし、なぜ倉庫参照またはIDを渡す必要があるのでしょうか? Itemはエンティティであり、Warehouseはそのエンティティを含む集約ルートであるように見えます。一般に、集約ルートの外部にエンティティを作成しないでください。 **編集:** Vaughn Vernonがレッドブックで説明しているように、いくつかの**アイデンティティ作成戦略**があります。その1つは、SQL Dbなどの永続化メカニズムにエンティティまたは集計の一意の識別子を生成させることです。