私はトランザクションスクリプトの世界から来たので、DDDを検討し始めたところです。DDD設計をデータベースの永続性と統合する正しい方法がわかりません。これは私が持っているものです:
組織ドメインオブジェクトのインスタンスを取得および保存するためのメソッドがインターフェイスに含まれている、OrganizationServiceと呼ばれるサービスクラス。組織は集約ルートであり、それに関連する他のデータがあります。メンバーとライセンスです。EF6データベースの最初のDBContextは、OrganizationService内で使用され、OrganizationDBエンティティと関連するMemberDBおよびLicenseDBエンティティを取得します。これらはすべて、OrganizationServiceによって取得され、Organizationドメインオブジェクトに読み込まれると、同等のドメインオブジェクトクラスに変換されます。このオブジェクトは次のようになります。
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
}
私はOrganizationServiceでRepositoryパターンを使用していません... EF6は現在、リポジトリを冗長化しているようで、EF自体をリポジトリとして使用しています。
設計のこの時点では、組織ドメインオブジェクトは貧弱です。EFPOCO組織クラスのように見えます。OrganisationServiceクラスは、リポジトリのように見えます!
次に、ロジックの追加を開始する必要があります。このロジックには、組織のライセンスとメンバーの管理が含まれます。トランザクションスクリプトの時代に、これらの操作を処理するためにOrganisationServiceにメソッドを追加し、DBと対話するためにリポジトリを呼び出しますが、DDDでは、このロジックは組織ドメインオブジェクト自体にカプセル化する必要があると思います...
ここで何をすべきかわかりません。ロジックの一部としてこのデータをデータベースに永続化する必要があります。これは、組織ドメインオブジェクト内でDbContextを使用してこれを行う必要があることを意味しますか?ドメインオブジェクト内でリポジトリ/ EFを使用することは悪い習慣ですか?もしそうなら、この永続性はどこに属していますか?
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
public void AddLicensesToOrganisation(IList<License> licensesToAdd)
{
// Do validation/other stuff/
// And now Save to the DB???
using(var context = new EFContext())
{
context.Licenses.Add(...
}
// Add to the Licenses collection in Memory
Licenses.AddRange(licensesToAdd);
}
}
代わりに、メモリ内の組織ドメインオブジェクトを変更し、永続化するためにそれをOrganisationServiceにプッシュして戻す必要がありますか?次に、オブジェクトで実際に何が変更されたかを追跡する必要があります(これはEFが独自のPOCOに対して行うことです!EFは単なるリポジトリーの置き換えではなく、ドメインレイヤーにもなる可能性があると感じ始めています)。
ここで任意のガイダンスをいただければ幸いです。