在Ninject 2中注入HttpContext

Bor*_*ens 14 dependency-injection ninject httpcontext

在我的asp.net mvc应用程序中,我使用Ninject作为DI框架.

我的控制器使用我的HttpAccountService从cookie获取信息.为此,我需要HttpAccountService中的HttpContext.Current.由于这是一个依赖项,我通过构造函数注入它:

kernel.Bind<IAccountService>()
    .To<HttpAccountService>()
    .InRequestScope()
    .WithConstructorArgument("context", HttpContext.Current);
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这总是绑定到相同的上下文,这使得在第一个请求完成后,这个上下文变得过时了.

我应该如何正确地注入我的HttpContext?

Rub*_*ink 23

WithConstructorArgument有一个过载,需要一个Func<NinjectContext,T>,即你可以使用:

... .WithConstructorArgument("context",ninjectContext =>HttpContext.Current);

它将在请求处理中调用提供的'回调'lambda并在该时间点获得正确的值[与您调用另一个重载并提供在Bind<>时间计算的常量值相反].

(如果你不是试图模拟上下文,我假设你会考虑使用它内联)