Sitzungsnull in ASP.Net MVC Controller Constructors
Warum ist der Session null im Konstruktor der Controller? Es kann zugegriffen werden, von Action-Methoden. Vermutlich, weil die MVC Routing framework ist verantwortlich für newing-Steuerung, die es einfach nicht (re-)instanziiert, die Sitzung an diesem Punkt.
Weiß jemand, ob dies gewollt ist und, wenn ja, warum?
[Ich habe es geschafft, dieses problem zu umgehen, indem Sie mit einem Lazy Loading Pattern.]
InformationsquelleAutor der Frage Chris Arnold | 2009-05-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Andrei Recht - es ist null, weil, wenn unter den ASP.NET MVC-framework, das HttpContext - (und daher HttpContext.Sitzung) wird nicht gesetzt, wenn die controller-Klasse ist konstruierter als man erwarten könnte, sondern es gesetzt ("injiziert") später von der ControllerBuilder Klasse. Wenn Sie möchten, zu einem besseren Verständnis des Lebenszyklus Sie können entweder nach unten ziehen, die ASP.NET MVC-framework (Quelle verfügbar ist), oder siehe: auf dieser Seite
Wenn Sie brauchen, um den Zugriff auf die Session dann einen Weg, wäre das überschreiben der "OnActionExecuting" - Methode und greifen Sie es, wie es verfügbar sein wird.
Jedoch, wie Andrej vorgeschlagen wird, wenn Ihr code ist angewiesen auf die Sitzung dann könnte es möglicherweise schwierig sein, schreiben unit-tests, so könnten Sie erwägen, das einwickeln der Sitzung in einer helper-Klasse, die können dann ausgelagert werden, für einen anderen nicht-web-version, wenn unter unit-tests, deshalb de-koppeln Ihren controller aus dem web.
InformationsquelleAutor der Antwort Andrew W
Zusätzlich zu den anderen Antworten hier, während
Controller.Session
wird nicht aufgefüllt, im Konstruktor, können Sie immer noch Zugriff auf die session durch:System.Web.HttpContext.Current.Session
mit der standard VORBEHALT, dass dieses verringert möglicherweise den controller Testbarkeit.
InformationsquelleAutor der Antwort Mike Chamberlain
Die Sitzung injiziert wird später im life-cycle. Warum müssen Sie die Sitzung im Konstruktor eh? Wenn Sie es brauchen für TDD, sollten Sie wickeln die Sitzung in eine mockable Objekt.
InformationsquelleAutor der Antwort Andrei Rînea
Können Sie überschreiben die Initialize-Methode, um Ihre Sitzung.
InformationsquelleAutor der Antwort Funlover
Wenn Sie mit einem IoC-Container, versuchen Sie die Injektion und die Verwendung der
HttpSessionStateBase
statt derSession
Objekt:InformationsquelleAutor der Antwort VahidN
Diese Antwort könnte hilfreich sein für einige Menschen
Wenn wir die Initialize-Methode überschreiben, dann müssen wir initialisieren base-Klasse mit Anfrage Rahmen : - Basis.Initialize(requestContext);
InformationsquelleAutor der Antwort Prashanth vunnam gcs