Ninject无法解析控制器的依赖关系,但服务没有问题

时间:2016-12-30 06:51:56

标签: asp.net-mvc ninject ninject.web.mvc

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

1 个答案:

答案 0 :(得分:0)

MVC有2个扩展点,用于注册MVC以通过依赖注入来解析服务:

  • ControllerBuilder.Current.SetControllerFactory
  • DependencyResolver.SetResolver

您应该使用其中一个而不是来解析控制器的服务。

无论您确切的问题是什么,它肯定会在这些类中的一个或两个内部,但您没有发布代码,因此没有人能够确切地告诉您出了什么问题。