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

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

无论您的确切问题是什么,它肯定在其中一个或两个问题中 类,但是您没有发布代码,所以没有人能告诉您到底出了什么问题。