문제

I created a binding for HttpContextBase in my NinjectWebCommon.RegisterServices method, but when I try to reference it in my controllers or services I get an error message.

Here's the binding:

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

Here's the error message:

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.

If I remove the binding, then it appears to do what I wanted (resolves to HttpContextWrapper), but I'm wondering how this gets registered?

도움이 되었습니까?

해결책

but I'm wondering how this gets registered?

Look at the source code of the MvcModule.cs and your question will be immediately answered:

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

다른 팁

I see the binding being registered by Ninject.Web.Common v3.2.3.0

If you are trying to mock the binding in your unit tests, you must remove it first like this:

// 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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top