あなたがドメインオブジェクトがあるとしましょう:Entity FrameworkのとDDD - ロードビジネス層にエンティティを渡す前に、関連するデータを必要と
class ArgumentEntity
{
public int Id { get; set; }
public List<AnotherEntity> AnotherEntities { get; set; }
}
をそして、あなたはそれに対処するためのASP.NETのWeb APIコントローラーがあります。
を[HttpPost("{id}")]
public IActionResult DoSomethingWithArgumentEntity(int id)
{
ArgumentEntity entity = this.Repository.GetById(id);
this.DomainService.DoDomething(entity);
...
}
エンティティ識別子を受け取り、idでエンティティをロードし、ドメインサービスでビジネスロジックを実行します。
問題: 問題は関連するデータです。 ArgumentEntityにはAnotherEntitiesコレクションが含まれています。これは、Include/Loadメソッドを使用して明示的に要求する場合にのみ、EFによって読み込まれます。 DomainServiceは、ビジネス層の一部であり、永続性、関連するデータおよびその他のEFの概念については何も知らないでください。サービスメソッドをDoDomething
は、ロードされたAnotherEntitiesコレクションでArgumentEntityインスタンスを受信することを期待します。 これは簡単です。必要なデータをRepository.GetByIdに含めて、関連するコレクションでオブジェクト全体を読み込みます。
は今大規模なアプリケーションの現実に簡略化した例から戻ってくることができます:
ArgumentEntityははるかに複雑です。それには複数の関連するコレクションが含まれており、関連するエンティティにも関連するデータがあります。
DomainServiceの複数の方法があります。各方法は、ロードされる関連データの異なる組み合わせを必要とする。
私は可能な解決策を想像することもできますが、それらのすべてが理想からかけ離れている:
は常に全体のエンティティをロード - >しかし、それは非効率的としばしば不可能です。
は、いくつかのリポジトリメソッド追加:GetByIdOnlyHeader、GetByIdWithAnotherEntities、GetByIdFullDataコントローラに特定のデータ・サブセットをロードするために - >が、コントローラがロードおよび各サービスメソッドに渡すためにどのデータに気づきます。 - >それは各サービスメソッド呼び出しのために非効率的なSQLクエリでGetByIdOnlyHeader、GetByIdWithAnotherEntities、GetByIdFullData各サービスの方法で特定のデータのサブセットをロードする:
は、いくつかのリポジトリのメソッドを追加します。 1つのコントローラアクションに対して10のサービスメソッドを呼び出すとどうなりますか?必要な追加データロードする
各ドメインのメソッド呼び出しリポジトリ方式(例えば:はをEnsureAnotherEntitiesLoaded) - 私のビジネス・ロジックは、関連データのEFの概念に気づいので>それは醜いです。
質問: がどのようにビジネス層に渡す前に、エンティティの読み込みに必要な関連データの問題を解決するのでしょうか?
私は明確にすべきだと思います:リポジトリはここでは抽象ですそれはタイプIRepositoryであり、DIを介して注入される。リポジトリインタフェースはビジネスロジックの一部であり、リポジトリ実装はDALの一部です。したがって、DALはアプリケーション層から呼び出されません。問題1:ビジネス層にエンティティの代わりに識別子を渡すことは、しばしば悪い習慣とみなされます。問題2:DoSomethingとDoSomethingElseを同じコントローラで呼び出す必要がある場合その場合、両方のメソッドがエンティティをロードして、1つではなく2つのSQLクエリを使用します。 –
私はあなたの見解を理解していますが、論理リポジトリインターフェイスは永続性の抽象であるため、論理的にはDALに属します。別の問題を考えてみましょう。アプリケーションコードの単体テストを書くときには、ドメインサービスだけでなくリポジトリもスタブします。問題1について:たぶん、私の経験は異なります。問題2:ドメインの問題ではなく、インフラの問題です。インフラストラクチャ(DAL)は、複数の負荷が目に見える問題になった場合に、いくつかのキャッシングを実装できます。 –