2016-12-30 32 views
1

1)我創建了一個ASP.NET MVC應用程序,並希望在應用程序本身中使用DbContext以及一些簡單的服務有點類似於分層結構。Ninject無法解析控制器的依賴關係,但對服務沒有問題

所以,我註冊的依賴標準NinjectWebCommon引導程序:

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

它能正常工作,如果它初始化一些MyService類的構造函數中的IDbContextFactory<WebDbContext>依賴。在調試中,我看到一個初始化的實例。

但是,如果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)還有一件事。數據庫上下文工廠並不是MyController在初始化時所拉取的唯一依賴項。有一對夫婦,如:

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

所以,如果我在解決方法的MyController依賴IDbContextFactory,它與其他依賴關係沒有問題。

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有2個擴展點註冊MVC通過依賴注入解決服務:

  • ControllerBuilder.Current.SetControllerFactory
  • DependencyResolver.SetResolver

您應該使用一個或其他不是都爲來解決你的控制器的服務。

無論你的確切問題是什麼,它肯定會在這些類中的一個或兩個裏面,但是你沒有發佈代碼,所以沒有人可以準確地告訴你到底發生了什麼問題。