Asp.net mvc 4 HttpContextBase是如何向ninject注册的?我没有';我不能明确地约束它

Asp.net mvc 4 HttpContextBase是如何向ninject注册的?我没有';我不能明确地约束它,asp.net-mvc-4,ninject,ninject.web.mvc,Asp.net Mvc 4,Ninject,Ninject.web.mvc,我在NinjectWebCommon.RegisterServices方法中为HttpContextBase创建了一个绑定,但当我尝试在控制器或服务中引用它时,会收到一条错误消息 以下是装订: kernel.Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(HttpContext.Current)).InRequestScope(); 如果我删除了绑定,那么它似乎做了我想做的事情(解析为Htt

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

以下是装订:

kernel.Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(HttpContext.Current)).InRequestScope();
如果我删除了绑定,那么它似乎做了我想做的事情(解析为HttpContextWrapper),但我想知道这是如何注册的

但我想知道这是怎么注册的

查看的源代码,您的问题将立即得到回答:

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

我看到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);
//WebCommonNinjectModule加载HttpContextBase。我们需要把它移除
var httpContextBaseBinding=kernel.GetBindings(typeof(System.Web.HttpContextBase)).FirstOrDefault();
RemoveBinding(httpContextBaseBinding);
kernel.Bind().ToMethod(m=>httpContextBaseMock.Object);

为什么您的
HomeController
采用
HttpContextBase
构造函数参数?为什么要在DI容器中注册
HttpContextBase
?这完全没有意义。这是一个有点做作的例子,我理解你对这件事的感受,但我很好奇它是如何在幕后形成的。我通常控制注册的内容,在这种情况下,ninject似乎是为我做的。好了,您自己回答了您的问题:
看来ninject是为我做的
@DarinDimitrov为什么它毫无意义?万一有人遇到同样的问题:从v3.2.1开始,
HttpContextBase
绑定自
MvcModule.cs
文件。您必须添加自己的绑定。您不需要自己的绑定,它是从Ninject.Web.Common注册的:我自己正在使用Ninject.MVC的v3.2.1,它仍然绑定自己的HttpContextBase。我认为这是因为尽管MvcModule.cs可能不再这么做了,但它仍然会自动绑定到Ninject.MVC使用的Ninject.Web.Common中。
// 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);