2010-09-01 13 views
14

In meiner asp.net mvc-Anwendung verwende ich Ninject als DI-Framework.Injection HttpContext in Ninject 2

Mein HttpAccountService wird von meinen Controllern verwendet, um Informationen von und zu Cookies zu erhalten. Dazu benötige ich den HttpContext.Current im HttpAccountService. Da es sich um eine Abhängigkeit I injiziert es den Konstruktor als solche Throught:

kernel.Bind<IAccountService>() 
    .To<HttpAccountService>() 
    .InRequestScope() 
    .WithConstructorArgument("context", HttpContext.Current); 

Leider diese bindet immer auf den gleichen Kontext, der das macht, nachdem die erste Anforderung beendet diesem Zusammenhang überholt wird.

Wie soll ich meinen HttpContext korrekt injizieren?

Antwort

23

WithConstructorArgument eine Überlastung hat, die eine Func<NinjectContext,T> nimmt, das heißt, können Sie verwenden:

....WithConstructorArgument("context",ninjectContext =>HttpContext.Current);

, die die zur Verfügung gestellt ‚Rückruf rufen 'Lambda innerhalb der Anfrage Verarbeitung und erhalten Sie den richtigen Wert zu diesem Zeitpunkt [im Gegensatz zu Sie die andere Überlast aufrufen und einen konstanten Wert, der bekommen s berechnet um Bind<> Zeit].

(Wenn Sie nicht den Kontext zu verspotten versuchen, gehe ich davon aus man bedenkt, wird es inline verwenden)

+0

Das Syntax nicht zu kompilieren scheint. Es kompiliert mit x => HttpContext.Current, aber dies erreicht nicht das erwartete Ergebnis. Könnte es sein, weil ich meinen Ninjectkernel von einer (statischen) Fabrik bekomme? –

+0

Bei näherer Betrachtung scheint es, dass ich jetzt den richtigen Kontext bekomme, aber mein Problem muss etwas anderes liegen. Thx –

+0

für den Rekord: Es war, weil ein RedirectToRoute zurücksetzt, dass Cookies anfordert. –

Verwandte Themen