这个问题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专家,但我正在努力......
答案 0 :(得分:3)
我的问题是在global.asax中,我启动了一个TaskManager类 定期在计时器上执行某些任务。
Phil Haack explains in details这是一个坏主意。不要在您的Web应用程序中执行此操作。这些重复性任务应该在一个单独的应用程序中完成(Windows服务或某些计划定期运行的控制台应用程序)。
现在的问题是你正在运行后台线程。这些后台线程在任何用户HTTP请求之外运行,因此HttpContext.Current
在它们内部显然为空。因此,即使您不遵循Phil Haack的建议并继续在ASP.NET应用程序中运行后台任务,您也必须重新构建您的方法,以便它不再依赖于任何HttpContext,因为在这些后台线程中没有这样的东西。