Ninject 无法通过 Application_Start 中的依赖解析器进行解析

本文关键字:依赖 Start Application Ninject | 更新日期: 2023-09-27 18:33:52

我整个上午都在试图解决这个问题,但似乎是时候征求意见了。

我有一个MVC/WebApi/SignalR应用程序。我有一个服务,我想与 Web 应用程序一起开始。我希望注入这项服务。所以这就是我要做的:

public static class NinjectWebCommon 
{
   ...
   private static void RegisterServices(IKernel kernel)
    {
        GlobalHost.DependencyResolver = new Microsoft.AspNet.SignalR.Ninject.NinjectDependencyResolver(kernel); 
        kernel.Bind<PricingService>().ToSelf().InSingletonScope();
    }
}
public class Application : HttpApplication
{
    protected void Application_Start()
    {
        ...
        PricingService pricingService = DependencyResolver.Current.GetService<PricingService>();
    }
}

我的问题是pricingService变量为空。

根据这篇文章,这种模式应该有效,但它没有。 可能受到 SignalR 依赖项解析器的影响,但我不太确定。

同时,当我在 WebApi 控制器中使用构造函数注入时,注入工作正常。

public class MyController : ApiController
{
    private readonly PricingService _pricingService;
    public MyController (PricingService pricingService)
    {
        _pricingService = pricingService;
    }
}

任何帮助将不胜感激。

Ninject 无法通过 Application_Start 中的依赖解析器进行解析

多亏了

史蒂夫的评论,我才能够解决这个问题。

缺少的部分是在MVC基础设施中注册NinjectDependencyResolver:

private static void RegisterServices(IKernel kernel)
{
    DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
    ...
}

这样做之后,DependencyResolver.Current的实例更改为 NinjectDependencyResolver

不幸的是,这还不是结束。我在尝试打电话时System.EntryPointNotFoundException DependencyResolver.Current.GetService<PricingService>().但在这次讨论的帮助下,这很容易解决。