2013-06-06 14 views
9

Ich habe eine Bindung für HttpContextBase in meiner NinjectWebCommon.RegisterServices-Methode erstellt, aber wenn ich versuche, es in meinen Controllern oder Diensten zu verweisen, erhalte ich eine Fehlermeldung.Wie wird HttpContextBase mit Ninject registriert? Ich habe es nicht explizit gebunden

Hier ist die Bindung:

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

Hier ist die Fehlermeldung:

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. 

Wenn ich die Bindung zu entfernen, dann scheint es, zu tun, was ich (beschließt zu HttpContextWrapper) wollte, aber ich Ich frage mich, wie das registriert wird?

+1

Warum nimmt Ihr 'HomeController' ein 'HttpContextBase' Konstruktor Parameter? Warum registrieren Sie die 'HttpContextBase' in Ihrem DI-Container? Das ist völlig bedeutungslos. –

+0

Dies ist ein bisschen ein künstliches Beispiel und ich verstehe Ihre Gefühle in der Sache, aber ich bin neugierig, wie es hinter den Kulissen verdrahtet ist. Ich kontrolliere normalerweise, was registriert ist, und in diesem Fall scheint es, dass Ninject es für mich tut. – BlakeH

+0

Da hast du deine Frage selbst beantwortet: "Es scheint, dass Ninject es für mich tut". –

Antwort

19

aber ich frage mich, wie das registriert wird?

Blick auf den Quellcode der MvcModule.cs und Ihre Frage sofort zu beantworten:

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

Danke, dass Sie mich in die richtige Richtung weisen! – BlakeH

+6

Falls jemand auf dasselbe Problem stößt: ab v3.2.1 wurde die 'HttpContextBase'-Bindung [https://github.com/ninject/ninject.web.mvc/commit/41b0136be6d265f82396d382ac87d999eb981a87) vom' MvcModule entfernt .cs' Datei. Sie müssen Ihre eigene Bindung hinzufügen. – Dave

+2

Sie benötigen keine eigene Bindung, sie ist von Ninject.Web.Common hier registriert: https://github.com/ninject/Ninject.Web.Common/blob/master/src/Ninject.Web.Common/WebCommonNinjectModule. cs –

3

Ich sehe die Bindung von Ninject.Web.Common v3.2.3.0 registriert wird

Wenn Sie versuchen, die Bindung in Ihren Komponententests zu verspotten, müssen Sie sie zuerst wie folgt entfernen:

// 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);