Ninject 无法解析控制器的依赖关系,但服务没有问题
Ninject can't resolve a dependency for a controller, but have no problems with services
1) 我正在创建一个 ASP.NET MVC 应用程序,并希望在应用程序本身中使用 DbContext
,以及一些类似于分层架构的简单服务。
所以,我在标准 NinjectWebCommon
引导程序中注册依赖项:
kernel
.Bind<IDbContextFactory<WebDbContext>>()
.To<WebDbContextFactory>()
.InRequestScope()
.WithPropertyValue(nameof(WebDbContextFactory.ConnectionString), ConfigurationManager.ConnectionStrings["WebDb"].ConnectionString);
它按预期工作,如果它在其构造函数中使用 IDbContextFactory<WebDbContext>
依赖项初始化一些 MyService
class。在调试中我看到一个初始化的实例。
但是,如果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) 还有一件事。 DB 上下文工厂不是 MyController
在初始化时拉取的唯一依赖项。有一对像:
kernel.Bind<MyService>().ToSelf().InRequestScope();
因此,如果我解决 MyController
中的 IDbContextFactory
依赖项,则其他依赖项没有问题。
4) 还有一件事。可能的解决方法是将数据库上下文工厂注册更改为:
kernel
.Bind<IDbContextFactory<WebDbContext>, WebDbContextFactory>()
.To<WebDbContextFactory>()
.InRequestScope()
.WithPropertyValue(nameof(WebDbContextFactory.ConnectionString), ConfigurationManager.ConnectionStrings["WebDb"].ConnectionString);
注意Bind()
方法中的第二种类型。当然,在 MyController
构造函数中进行相应的更改。但 WebDbContextFactory
实际上是 WebDbContextFactory : IDbContextFactory<WebDbContext>
。我认为它唯一不同的地方是它在我的本地程序集中(不过是另一个引用的项目),而 IDbContextFactory<>
是外部程序集。嗯?
MVC 有 2 个扩展点用于注册 MVC 以通过依赖注入解析服务:
- ControllerBuilder.Current.SetControllerFactory
- DependencyResolver.SetResolver
您应该使用其中之一而不是两者来为您的控制器解析服务。
无论您的确切问题是什么,它肯定在其中一个或两个问题中 类,但是您没有发布代码,所以没有人能告诉您到底出了什么问题。
1) 我正在创建一个 ASP.NET MVC 应用程序,并希望在应用程序本身中使用 DbContext
,以及一些类似于分层架构的简单服务。
所以,我在标准 NinjectWebCommon
引导程序中注册依赖项:
kernel
.Bind<IDbContextFactory<WebDbContext>>()
.To<WebDbContextFactory>()
.InRequestScope()
.WithPropertyValue(nameof(WebDbContextFactory.ConnectionString), ConfigurationManager.ConnectionStrings["WebDb"].ConnectionString);
它按预期工作,如果它在其构造函数中使用 IDbContextFactory<WebDbContext>
依赖项初始化一些 MyService
class。在调试中我看到一个初始化的实例。
但是,如果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) 还有一件事。 DB 上下文工厂不是 MyController
在初始化时拉取的唯一依赖项。有一对像:
kernel.Bind<MyService>().ToSelf().InRequestScope();
因此,如果我解决 MyController
中的 IDbContextFactory
依赖项,则其他依赖项没有问题。
4) 还有一件事。可能的解决方法是将数据库上下文工厂注册更改为:
kernel
.Bind<IDbContextFactory<WebDbContext>, WebDbContextFactory>()
.To<WebDbContextFactory>()
.InRequestScope()
.WithPropertyValue(nameof(WebDbContextFactory.ConnectionString), ConfigurationManager.ConnectionStrings["WebDb"].ConnectionString);
注意Bind()
方法中的第二种类型。当然,在 MyController
构造函数中进行相应的更改。但 WebDbContextFactory
实际上是 WebDbContextFactory : IDbContextFactory<WebDbContext>
。我认为它唯一不同的地方是它在我的本地程序集中(不过是另一个引用的项目),而 IDbContextFactory<>
是外部程序集。嗯?
MVC 有 2 个扩展点用于注册 MVC 以通过依赖注入解析服务:
- ControllerBuilder.Current.SetControllerFactory
- DependencyResolver.SetResolver
您应该使用其中之一而不是两者来为您的控制器解析服务。
无论您的确切问题是什么,它肯定在其中一个或两个问题中 类,但是您没有发布代码,所以没有人能告诉您到底出了什么问题。