IMO では、ドメイン モデル オブジェクトをエンティティ フレームワーク エンティティとして使用しないでください。アトミック メソッドで構成される適切にカプセル化されたドメイン オブジェクトを作成することはできません。代わりに、EF が必要とする getter と setter を持つパブリック プロパティが必要になり、これがAnemic Domain Modelにつながります。
基本的に、ドメイン オブジェクトをエンティティ フレームワーク エンティティとして倍増させようとすると、設計が損なわれます。
代わりに、 memento patternに大まかに似たものを使用します。これにより、「mementos」として機能する EF エンティティでドメイン オブジェクトを再水和します。Vaugh Vernon は、これらのオブジェクトを「状態オブジェクト」と呼んでいます。
EF が単純な POCO を使用できることを考えると、モデルがそれらを参照する必要があるため、これらのクラスを DbContext/Respositories をホストするアセンブリとは別のアセンブリに配置します。それらは単なる POCO であるため、モデルを EF に結び付けることはありません。
したがって、次の 3 つのアセンブリが存在する可能性があります。
- MyProject.Model / MyProject.Core / MyProject.Domain ... DDD モデル クラスとリポジトリ インターフェイスを含む
- MyProject.Infrastructure ... DBContext、リポジトリ実装、および状態オブジェクトを含む
例:
public class PersonRepository : EntityFrameworkRepository, IPersonRepository
{
public Person GetById(Guid personId)
{
using (MyDbContext ctx = new MyDbContext())
{
var personState = (from p in ctx.People
where p.PersonId == personId
select p).FirstOrDefault();
return Person.RestoreFromState(personState );
}
}
}
アップデート
EF Core を使用すると、プライベート フィールドにマップできるようになったため、設計の整合性を維持するためにこのレベルの複雑さを追加する必要がない場合があります。
また、この件に関するVaughn Vernon の次の投稿をお勧めします。