在MVC3控制器外部调用Ninject时,HttpContext为null

时间:2012-06-12 21:40:25

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

这个问题Ninject Dependency Injection in MVC3 - Outside of a Controller接近我正在经历的问题,但并不完全。

我有一个使用Ninject 3的ASP.NET MVC3站点,它与构造函数注入非常有效。我的所有依赖项都已解析,包括那些传入HttpContext.Current。

的依赖项

我的问题是在global.asax中,我启动了一个TaskManager类,它定期在计时器上执行某些任务。在TaskManager类中,我没有控制器,所以如果我需要访问我的一个依赖项(比如我的错误记录服务),我使用一个可以访问内核对象的静态包装类:

var logger = MyContainer.Get<ILoggingService>();
logger.Error("error doing something...", ex);

.Get方法只执行一个kernel.Get调用解析我的依赖。每次我在我的其他依赖项上使用此方法时效果很好。但是,ILoggingService有一个名为MyWebHelper的依赖项,它通过它的构造函数注入,并在其构造函数中包含HttpContext。

    public class DefaultLogger : ILoggingService
    {     
        public DefaultLogger(IRepository<Log> logRepository, IWebHelper webHelper)
        {
            _logRepository = logRepository;
            _webHelper = webHelper;
       }
    }

    public class MyWebHelper : IWebHelper
    {
      public MyWebHelper(HttpContext httpContext)
      {
          _httpContext = httpContext;
      }
    }

在我的网站的其余部分,这一切都运行正常,因为所有依赖项都被注入我的MVC控制器。但是,如果我手动调用我的静态包装类来获取我的依赖关系,那么什么是行不通的。我收到错误:

  

使用从HttpContext到方法

的绑定激活HttpContext时出错      

提供商返回null。

所以,它并没有像我在MVC应用程序的其余部分那样给我一个HttpContext。我希望这是有道理的,我还不是一个ninject专家,但我正在努力......

1 个答案:

答案 0 :(得分:3)

  

我的问题是在global.asax中,我启动了一个TaskManager类   定期在计时器上执行某些任务。

Phil Haack explains in details这是一个坏主意。不要在您的Web应用程序中执行此操作。这些重复性任务应该在一个单独的应用程序中完成(Windows服务或某些计划定期运行的控制台应用程序)。

现在的问题是你正在运行后台线程。这些后台线程在任何用户HTTP请求之外运行,因此HttpContext.Current在它们内部显然为空。因此,即使您不遵循Phil Haack的建议并继续在ASP.NET应用程序中运行后台任务,您也必须重新构建您的方法,以便它不再依赖于任何HttpContext,因为在这些后台线程中没有这样的东西。