-1

私は正しく流れていくが、ロードブロックを走り続けるプロジェクト構造を考え出しています。特に、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がドメイン内のビジネスロジックを呼び出すだけであれば、これは私の問題を解決するでしょう。これは理にかなっていますか?この上

+0

もちろん、これはあまりにも屈辱的なものとして閉鎖されている可能性があります。しかしここにあなたが考慮すべきものがあります。 DbContextを使用しているものがある場合、EFライブラリを参照できないようにする方法はありません。おそらくあなたのAPIは 'List 'のような一般的な構文を使用するか、そうでないものを使用します。 http://jeffreypalermo.com/blog/the-onion-architecture-part-1/またはhttp://codingcanvas.com/hexagonal-architecture/ –

+0

また、Unit of Workは次のような場合は冗長です。 DbContextはすでに作業単位であるため、DbContextを使用しています。そのような抽象化を作成するほとんどの人は、(IQueryablesのような)実装の詳細を漏らして、データ技術を実際にスワップするのを難しくしています。 –

+0

@ErikFunkenbusch必ずしもそうではありません。はい、EFは基本的に作業単位ですが、別のORMで交換したい場合は、懸念の分離はどうでしょうか。さらに、アプリケーション全体で重複するコード/クエリロジックの量を削減しようとするとどうでしょうか。 UoWとRepositoryパターンをEFで実装する理由はたくさんあります。 –

答えて

2

私の意見:

は、両方のドメインとデータのプロジェクトを参照するAPIプロジェクトのために、それは大丈夫ですか?

私にとっては問題ありません。

ドメインプロジェクトのすべてのインターフェイスを配置しているのは間違いありませんか?

YES

TestProjDbContextは、EFのためにどのようなプロジェクトに座る必要がありますか?私の最初の考えはデータプロジェクトでしたか?

私は通常、ドメインプロジェクトのDTO/POCOSのような項目が行く

にBlahBlahContextクラスを置きますか? APIプロジェクトまたはドメインプロジェクトでは?

Dtoと呼ばれるこの別のプロジェクト用に作ったものです。必要に応じてこれを参照してください。

Uは、APIにAutoMapperがインストールされ、TestProj.Domainが参照されているため、元のビジネスエンティティをAPIのDTOにマップできます。

確か

最後に、どこのビジネスロジックは行くのですか?データレイヤーとAPIの間のルール。

私は、溶液中で、この別のプロジェクトのために使う - >と呼ばれるサービス

は、この情報がお役に立てば幸いです。

+0

優れた応答!つまり、DbContextをDomainプロジェクトに配置するだけで、ApiプロジェクトとDataプロジェクトの両方がそこから参照できるようになります。DbContextに渡す必要があるため、StartUp.csでef sqlserverサービスを構成するときに固まっていました。私は、Apiからデータプロジェクトを参照してこの作業を行うことはしませんでした。あなたがこれは大丈夫だと言っていますが、私はApiだけがサービスプロジェクトについて知っている方が好きです。これも大丈夫ですか? –

+0

>私はApiからデータプロジェクトを参照することはしませんでした。 - > ApiでDataプロジェクトのクラスをどのように使用する予定ですか? Automapperに必要なので、参照する必要があります。 「私はApiがサービスプロジェクトについて知っているだけだ」 (私は、ビジネスロジックをApiに入れて、サービスをもっと良く使うのが好きではない) – paulpeters

+0

私はApiのData Projectクラスでサービスを使って作業する予定です(サービスだけがDataプロジェクトと話します)。たとえば、GetCustomerByIdやGetCustomersのようなビジネスロジックのない基本クラスであってもCustomerServiceから呼び出されます。このようにして、私は自分のコントローラにICustomerServiceを注入します。 Api/Mvcコントローラにサービスとリポジトリの両方を注入するのは正常ですか?私は、サービスがリポジトリへの呼び出しも行うと仮定しています。私はこれが私の混乱の大部分であると思う。 –

関連する問題