0

ソリューションに 4 つのプロジェクトがあります

  • DAL_プロジェクト
  • BLL_プロジェクト
  • Interface_Project
  • WebApi_Project

Interface_Projectには、 ICar_DALICar_BLLの 2 つのインターフェイスがあります。

DAL_Projectには、ICar_DALを実装するクラスCar_DALがあります

BLL_Projectには、 ICar_BLLを実装するクラスCar_BLLがあり、そのコンストラクターはICar_DALを受け取ります

WebApi_Projectには API コントローラーCarApiControllerがあり、そのコンストラクターはICar_BLLを受け取ります

WebApi コントローラーのコンストラクターの依存関係の解決は、Bootstrapper.cs でこれを使用して Unity.WebApi によって行われます。

container.RegisterType<ICar_BLL, Car_BLL>();

私の Car_BLL がさらにコンストラクターで ICar_DAL を必要としない場合、これはうまくいきます。

それを機能させるために、次のようなことができます:

container.RegisterType<ICar_BLL, Car_BLL>();
container.RegisterType<ICar_DAL, Car_DAL>();

しかし、それは、WebApi_ProjectにDAL_Projectへの参照を追加する必要があることを意味します。これは、決してやりたくないことです。DAL_ProjectはBLL_Projectによってのみ参照されるべきです

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

2

しかし、それは、WebApi_Project に DAL_Project への参照を追加する必要があることを意味します。これは、決してやりたくないことです。

ああ、それをしたくない場合に依存関係をどのように行うべきかについて誤解しているようです。DI コンテナーは、実際にはホストであるアプリケーションの最外層で構成されます。コンポジション ルートとも呼ばれます。あなたの場合、これは Web API のホスティング アプリケーションです。Web API をホストするために ASP.NET を使用している場合、これはコンポジション ルートを実行し、他のすべての基礎となるプロジェクトを参照する適切な場所です。

個人的には、複雑なプロジェクトでは、 Composition rootProjectName.Compositionとして機能するクラス ライブラリを使用する傾向があります。ここで DI コンテナーを構成します。これは、他のすべてを参照するプロジェクトです。明らかに、DI ルートを構成するには、すべての依存プロジェクトと実装が必要です。このアセンブリは、ホスティング アプリケーションと、ホスティング アプリケーションの Initialize メソッドで呼び出されるメソッドで参照されます。.CompositionBootstrapper.Initialize

  • Application_Startにある ASP.NET ホストの場合Global.asax
  • デスクトップ アプリケーションまたはセルフ ホストの場合Mainは、エントリ ポイントとなるメソッドになります。
于 2013-07-24T21:01:46.403 に答える