DDDを学ぼうとしています。プロパティ管理ドメインをモデリングしていますが、プロパティ管理コンテキストと常駐コンテキストという2つのコンテキスト(サブドメイン?)があると思います。
Apartment
sとFloorplan
sを保持する集約ルートUnit
があるとします。各Apartment
には多数のFloorplans
を含めることができ、各Floorplan
には多数のUnit
を含めることができます。
_public class Apartment : IAggregateRoot // for clarity
{
public int Id { get; }
public Address Address { get; set; }
public ICollection<Floorplan> Floorplans { get; set; }
}
public class Floorplan
{
public int Id { get; }
public int ApartmentId { get; set; }
public string Name { get; set; }
public int Bedrooms { get; set; }
public int Bathrooms { get; set; }
public ICollection<Unit> Units { get; set; }
}
public class Unit
{
public int Id { get; }
public int FloorplanId { get; set; }
public string Number { get; set; }
}
_
プロパティ管理のコンテキストで、Resident
に割り当てられるUnit
を紹介するとします。私のUnit
およびResident
クラスは次のようになります。
_public class Unit
{
public int Id { get; }
public int FloorplanId { get; set; }
public string Number { get; set; }
public ICollection<Resident> Residents { get; set; }
}
public class Resident // in the property management context
{
public int Id { get; }
public string FirstName { get; set; }
public string LastName { get; set; }
public void UpdateBalance(...);
}
_
私の質問は、常駐コンテキスト(PayRent()
またはUpdateProfile()
などが可能)にResident
を導入する場合、プロパティ管理コンテキストでResident
と1:1の関係にある必要があります、しかし、私はApartment
を最後まで通らないと、非集合ルートエンティティを参照できないと思っていました。
集合根についての私の理解は正しくありませんか? Residentは両方のコンテキストで集約ルートですか?それがどのようにモデル化されるかはわかりません。
DDDの実践者が理解する必要がある最も重要な情報、そして率直に言って、このタグで私が目にする最大の障害は、DDDがシステムのfunctional要件のモデリングに関するものであることです。つまり、DDDは、システムのbehaviorsに焦点を当てた視点を取り、これらの動作をサポートするデータを実装の詳細にするように要求します。
上記の質問では、「this does that」ではなく、「this has that」がたくさんあります。私はあなたのモデルが必ずしも不正確であると言うつもりはありません、むしろあなたはあなたが上で概説した問題に正確につながる方法であなたのシステムをアプローチしていると言います。システム内のデータのみに注目すると(ドメインモデルは物理モデルによく似ていると思います)、ほとんどの場合、「重複」の問題につながります。
この場合、Resident
verticallyを動作に応じて分割する必要があります(ただし、ID
を共有します)。プロパティ管理コンテキストのResident
にFirstName
およびLastName
フィールドが必要なのはなぜですか。これらのデータは、コンテキスト内に存在するユースケースに関して重要ですか? UpdateBalance
またはRentUnit
には名前が必要ですか?おそらく違います。一方、Resident ContextのResident
は、この情報を更新する必要がある場合、これらのフィールドを必要とします。
そして明確にするために、Resident
(つまり、FirstName
およびLastName
フィールドを持つエンティティ)は絶対はアパートメントなしで存在できます。私はここに座っています。常に人工的な制約に注意してください。私はあなたから(まだ!)レンタルしていないかもしれませんが、それでもあなたのシステムが私の存在を知らないわけではありません。この場合、Person
またはCustomer
の方がResident
よりも適切な名前になる可能性があります(後者の場合、これが意味を持つため)。
要約すると、モデルには、永続データストアからの識別子を共有する2つのコンテキスト(常駐管理とプロパティ管理)の2つのエンティティ(Person
とResident
)が必要です。それらの存在に関連する特定の動作(異なるフィールドの更新)。これらが同じ物理データベーステーブルにマップするかどうかは、実装の詳細です。