2016-12-30 12 views
1

1)私はASP.NET MVCアプリケーションを作成していて、簡単なサービスと共にアプリケーション自体にDbContextを使用したい階層化されたアーキテクチャに少し似ています。Ninjectはコントローラーの依存関係を解決できませんが、サービスに問題はありません

だから、私は標準NinjectWebCommonブートストラップに依存関係を登録しています:

kernel 
    .Bind<IDbContextFactory<WebDbContext>>() 
    .To<WebDbContextFactory>() 
    .InRequestScope() 
    .WithPropertyValue(nameof(WebDbContextFactory.ConnectionString), ConfigurationManager.ConnectionStrings["WebDb"].ConnectionString); 

予想通り、それはそのコンストラクタでIDbContextFactory<WebDbContext>依存して、いくつかのMyServiceクラスを初期化する場合には、動作します。デバッグでは、初期化されたインスタンスが表示されます。

ただし、MyControllerに同じ依存関係のコンストラクタがある場合、Ninjectは依存関係が登録されていないという例外をスローします。

ええと、なぜですか?

2)とカーネルの初期化は以下の通りです:

var kernel = new StandardKernel(); 
    try 
    { 
     kernel.Bind<Func<IKernel>>().ToMethod(ctx =>() => new Bootstrapper().Kernel); 
     kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>(); 

     RegisterServices(kernel); 

     ControllerBuilder.Current.SetControllerFactory(new ControllerFactory(kernel)); 
     DependencyResolver.SetResolver(new AppDependencyResolver(kernel)); 

     return kernel; 
    } 
... 

RegisterServices()方法は依存登録することを含んでいるので、私は、たとえば、コントローラの工場に渡されたとき、カーネルはすでにそれを持っていると仮定します。

3)さらにもう1つ。 DBコンテキスト・ファクトリは、初期化時にMyControllerがプルする唯一の依存性ではありません。私はMyControllerIDbContextFactoryの依存を回避する場合

kernel.Bind<MyService>().ToSelf().InRequestScope(); 

だから、それは他の依存関係に問題を持っていない:カップルのようにあります。

4)また別のことです。可能な回避策はこれにDBコンテキストファクトリの登録を変更することである。

kernel 
    .Bind<IDbContextFactory<WebDbContext>, WebDbContextFactory>() 
    .To<WebDbContextFactory>() 
    .InRequestScope() 
    .WithPropertyValue(nameof(WebDbContextFactory.ConnectionString), ConfigurationManager.ConnectionStrings["WebDb"].ConnectionString); 
Bind()

お知らせ方法における第二のタイプ。もちろん、対応する変更はMyControllerコンストラクタにあります。しかし、WebDbContextFactoryは実際にはWebDbContextFactory : IDbContextFactory<WebDbContext>です。それが違う唯一の方法は、私のローカルアセンブリ(別の参照されたプロジェクトだが)にあり、IDbContextFactory<>は外部のアセンブリであるということだ。ハァッ?

答えて

0

MVCは、依存性注入を介してサービスを解決するためにMVCを登録するための2つの拡張ポイントがあります。ControllerBuilder.Current.SetControllerFactory

  • DependencyResolver.SetResolver

あなたは、どちらか一方を使用する必要がありますのいずれも、コントローラのサービスを解決できません。

あなたの問題が何であっても、それらのクラスのいずれかまたは両方にあることは間違いありませんが、あなたは間違っていることを誰にも正確に伝えることができません。

関連する問題