複数のアーキテクチャ層を持つプロジェクトに取り組んでいます。これらのレイヤーは独自のクラス ライブラリ プロジェクトにありますが、すべて同じソリューションにあります。下位層では、モデル、リポジトリ、および dbcontext を使用して、リポジトリ パターンを実行しています。リポジトリの上には、すべてのビジネス ロジックを含むサービス レイヤーがあります。現在、これらのさまざまなコンポーネントをインスタンス化して使用するためのコードは、単体テストでは次のようになります。
using (var context = m_kernel.Get<IPortalContext>())
{
var accountRepository = m_kernel.Get<IAccountRepository>(new ConstructorArgument("context", context));
var eventRepository = m_kernel.Get<IEventRepository>(new ConstructorArgument("context", context));
var accounts = m_kernel.Get<IAccountService>(new ConstructorArgument("repository", accountRepository));
var events = m_kernel.Get<IEventService>(new ConstructorArgument("repository", eventRepository));
var account = accounts.GetByUsername("test@test.com");
}
コンテキストを作成し、リポジトリを作成して既存のコンテキストを提供し、最後にサービスを作成してリポジトリを提供することがわかります。その後、私は自由にサービスを利用できます。
ただし、そのコードは非常に冗長です。外部ではなく、サービスの内部にリポジトリ インスタンスを作成することで、よりクリーンにすることができます。
ただし、これをやろうとしているときに混乱が生じます。DI に Ninject を使用しており、コンストラクターIAccountRepository
内のインターフェイスにバインドされたクラスのインスタンスを作成したいと考えています。IAccountService
その上、提供された も使用することを知る必要がIPortalContext
あります。
Ninject を依存関係としてサービス レイヤー プロジェクトに追加し、そこに新しいカーネルを作成し、IAccountService
コンストラクターの内部で Kernel.Get() を使用する必要がありますか? または、たとえば、単体テストからこれをすべて実行するように Ninject に指示する方法はありますか?