Ninject没有通过Application_Start中的DependencyResolver进行解析

时间:2014-12-10 10:02:18

标签: c# asp.net-web-api ninject

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

我有一个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变量为空。

根据this post,这种模式应该有效,但事实并非如此。可能是SignalR依赖解析器有影响,但我不太确定。

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

public class MyController : ApiController
{
    private readonly PricingService _pricingService;

    public MyController (PricingService pricingService)
    {
        _pricingService = pricingService;
    }
}

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:4)

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

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

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

执行此操作后,DependencyResolver.Current的实例已更改为NinjectDependencyResolver

不幸的是,这不是结束。我试图致电System.EntryPointNotFoundException时得到DependencyResolver.Current.GetService<PricingService>()。但是在this discussion的帮助下很容易解决这个问题。