如何在ninject中注册HttpContextBase?我没有明确地绑定它

时间:2013-06-06 12:57:01

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

我在NinjectWebCommon.RegisterServices方法中为HttpContextBase创建了一个绑定,但是当我尝试在我的控制器或服务中引用它时,我收到一条错误消息。

这是绑定:

kernel.Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(HttpContext.Current)).InRequestScope();

以下是错误消息:

Error activating HttpContextBase
More than one matching bindings are available.
Activation path:
 2) Injection of dependency HttpContextBase into parameter abase of constructor of type HomeController
 1) Request for HomeController

Suggestions:
 1) Ensure that you have defined a binding for HttpContextBase only once.

如果我删除绑定,那么它似乎做我想要的(解析为HttpContextWrapper),但我想知道这是如何注册的?

2 个答案:

答案 0 :(得分:20)

  

但我想知道这是如何注册的?

查看MvcModule.cs的源代码,您的问题将立即得到解答:

this.Kernel.Bind<HttpContext>().ToMethod(ctx => HttpContext.Current).InTransientScope();
this.Kernel.Bind<HttpContextBase>().ToMethod(ctx => new HttpContextWrapper(HttpContext.Current)).InTransientScope();

答案 1 :(得分:3)

我看到绑定是由Ninject.Web.Common v3.2.3.0

注册的

如果您尝试在单元测试中模拟绑定,则必须首先将其删除:

// WebCommonNinjectModule loads HttpContextBase. We need to remove it
var httpContextBaseBinding = kernel.GetBindings(typeof(System.Web.HttpContextBase)).FirstOrDefault();
kernel.RemoveBinding(httpContextBaseBinding);
kernel.Bind<System.Web.HttpContextBase>().ToMethod(m => httpContextBaseMock.Object);