私は正しく流れていくが、ロードブロックを走り続けるプロジェクト構造を考え出しています。特に、EF用のDbContextをどこに置くべきかわかりません。私のAPIが自分のデータレイヤーを参照しないようにしたい。私が考えることができるのは、EntityFrameworkをドメインレイヤーにインストールし、そこにDbContextを置くことだけです。StartUp.csのDbContextを参照すると、.NETコアアプリケーションでアーキテクチャが乱雑になっています
TestProj.Dataクラスライブラリ(.NETコア)
Entity Frameworkがインストールされています。 UnitOfWorkクラスのRepositoriesフォルダに、データベース呼び出しを行うすべてのリポジトリが含まれています。 EF Migrationも含まれます。ビジネスエンティティのTestProj.Domainを参照してください。
TestProj.Domainクラスライブラリ(.NETコア)
モデルは、すべてのビジネスエンティティとIUnitOfWorkインターフェースとTestProj.DataすなわちICustomerRepositoryにおけるリポジトリのインターフェースの全てをフォルダ。
TestProj.ApiウェブAPIプロジェクト(.NETコア)
私はこれが唯一のTestProj.Domainを参照する必要があると考えていますが、私は起動時に設定するためにも、すべてのサービスをTestProj.Dataを参照する必要が.cs、すなわち
services.AddDbContext<TestProjDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddTransient<IUnitOfWork, UnitOfWork>();
services.AddTransient<ICustomerRepository, CustomerRepository>();
ここで私は混乱し始めます。
私の質問:
両方のドメインとデータのプロジェクトを参照するAPIプロジェクトのために、それは大丈夫ですか? StartUp.csの依存関係注入をセットアップするために必要なようです。
ドメインプロジェクトのすべてのインターフェイスを入れていますか?
TestProjDbContextはどのようなプロジェクトでEFの対象にする必要がありますか?私の最初の考えはデータプロジェクトでしたか?
DTO /ポコスのようなアイテムはどこにありますか? APIプロジェクトまたはドメインプロジェクトでは? APIにAutoMapperがインストールされていて、TestProj.Domainが参照されているので、元のビジネスエンティティをAPIのDTOにマップできます。
最後に、ビジネスロジックはどこに行くのですか?データレイヤーとAPIの間のルール。私は適切な場所がTestProj.Domainであると仮定しています。 APIがIUnitOfWorkを私のAPIに注入するのではなく、TestProj.Domain.Services.CustomerServiceを注入するのではなく、APIがドメイン内のビジネスロジックを呼び出すだけであれば、これは私の問題を解決するでしょう。これは理にかなっていますか?この上
もちろん、これはあまりにも屈辱的なものとして閉鎖されている可能性があります。しかしここにあなたが考慮すべきものがあります。 DbContextを使用しているものがある場合、EFライブラリを参照できないようにする方法はありません。おそらくあなたのAPIは 'List'のような一般的な構文を使用するか、そうでないものを使用します。 http://jeffreypalermo.com/blog/the-onion-architecture-part-1/またはhttp://codingcanvas.com/hexagonal-architecture/ –
また、Unit of Workは次のような場合は冗長です。 DbContextはすでに作業単位であるため、DbContextを使用しています。そのような抽象化を作成するほとんどの人は、(IQueryablesのような)実装の詳細を漏らして、データ技術を実際にスワップするのを難しくしています。 –
@ErikFunkenbusch必ずしもそうではありません。はい、EFは基本的に作業単位ですが、別のORMで交換したい場合は、懸念の分離はどうでしょうか。さらに、アプリケーション全体で重複するコード/クエリロジックの量を削減しようとするとどうでしょうか。 UoWとRepositoryパターンをEFで実装する理由はたくさんあります。 –