1)我正在创建一个ASP.NET MVC应用程序,并希望在应用程序本身中使用DbContext
,以及一些稍微类似于分层架构的简单服务。
所以,我在标准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)还有一件事。 DB上下文工厂不是MyController
初始化时唯一依赖的依赖项。有几个像:
kernel.Bind<MyService>().ToSelf().InRequestScope();
因此,如果我解决IDbContextFactory
中的MyController
依赖项,则其他依赖项没有问题。
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 :(得分:0)
MVC有2个扩展点,用于注册MVC以通过依赖注入来解析服务:
您应该使用其中一个而不是来解析控制器的服务。
无论您确切的问题是什么,它肯定会在这些类中的一个或两个内部,但您没有发布代码,因此没有人能够确切地告诉您出了什么问题。