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<>
是外部組件。咦?