我在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),但我想知道这是如何注册的?
答案 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);