あなたの質問で与えられた構造で気づいたいくつかのあいまいさに対処したいと思います。あなたの構造を見ると、ある種のオニオン-/クリーン-/ヘキサゴンアーキテクチャを実装しようとしていると思います。
上記の提案されたアーキテクチャ ガイドラインを分析すると、Core プロジェクトには、この場合の Entity Framework などのインフラストラクチャの問題を含むべきではないことが一目で明らかになります。コア自体には、ビジネス/ドメイン モデル (ビジネス ルールに従って) とドメイン サービスのみを含める必要があります。
ここで少し考えてみましょう: EF やその他のインフラストラクチャに関する問題を取り上げるとしたら、Core のテストはどのようになるでしょうか? コアをテストすることにより、通常、一度に1 つのことをテストしようとします...そのため、残りの依存関係をモックアウトする必要はありません。
あなたの質問に正確に答えるために、物事に名前を付けるのは簡単ではありません. 回答では、アプリケーションの残りの部分から物事を分離することをお勧めしているようです。それ自体は良いことですが、お勧めしません。いくつかの優れたプラクティスのためだけに多くのプロジェクトを使用すると、苦痛になる可能性があります。私がこれを書いている理由の例は、3 つの異なることのために 3 つの追加プロジェクトでソリューションをコンパイルするための余分な時間を考えただけです。
これらのインフラストラクチャの問題を整理するための私の提案は次のとおりです。
というプロジェクトを作成します。ProjectName.Infrastructure
- 必要な NuGet パッケージ/DLL 参照をそれぞれプロジェクトに追加します。
- このプロジェクト内にディレクトリを作成して、サービスを整理します
作成したディレクトリごとに、ここにサービスの実装を追加/作成します
- 各サービスが、消費者クラスに挿入されるインターフェースを実装していることを確認してください
- 良いアドバイスとして、クラス名に従ってこれらのサービスを名前空間で分けることをお勧めします。
ProjectName.Infrastructure.EmailService
最後の部分は、NInject を介してこれらのインフラストラクチャの問題を結び付けることです。
最後に: あなたが書いたように、これらのサービスをクラス レベルで静的にする必要が本当にないことを願っています。その場合でも、適切な NInject バインディング スコープを介してそのようにバインドできます。