Sehr einfache Frage: Werden Controller in ASP.NET für jede HTTP-Anforderung erstellt oder werden sie beim Start der Anwendung erstellt und bei allen Anforderungen wiederverwendet?
Wird der Controller nur für eine bestimmte HTTP-Anforderung erstellt?
Kann ich mich darauf verlassen, wenn meine vorherigen Annahmen korrekt sind? Ich möchte einen Datenbankkontext (Entity Framework) erstellen, der nur für eine Anforderung verwendet wird. Wenn ich es als eine im Konstruktor des Controllers initialisierte Eigenschaft erstelle, wird dann gewährt, dass für jede Anforderung eine neue Kontextinstanz erstellt wird?
Antworten:
Für jede Anforderung wird ein Controller erstellt
ControllerFactory
(der standardmäßig der istDefaultControllerFactory
).http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx
Beachten Sie, dass der
Html.Action
HTML-Helper einen anderen Controller erstellt.Die Kurzversion
ControllerActivator.Create
wird aufgerufen (für jede Anforderung), um einen Controller zu erstellen (der einen neuen Controller entweder über den DependencyResolver oder über den Activator einleitet, wenn kein Resolver eingerichtet wurde):Die längere Version ist folgende (Hier ist der Code aus der Quelle des MvcHandler):
Hier ist der Controller-Werkscode:
Was im Grunde so heißt:
Welche ruft diese Methode in der
ControllerActivator
(Dieser Code versucht, den DependencyResolver nach einer Instanz zu fragen, oder verwendet nur die Activator-Klasse):Dies könnte unter zu viele Informationen fallen ... Aber ich wollte zeigen, dass Sie wirklich für JEDE Anfrage einen neuen Controller bekommen.
quelle
Ich habe einen leeren Konstruktor für einen Controller erstellt und einen Haltepunkt in den Konstruktor eingefügt. Es wurde jedes Mal getroffen, wenn es eine neue Anfrage gab. Ich denke, es ist für jede Anfrage erstellt.
quelle
Html.RenderAction("action", "controller");
)Der Controller wird erstellt, wenn eine Aktion in einem bestimmten Controller ausgeführt wird.
Ich habe ein Projekt, in dem alle meine Controller von einem erben,
ApplicationController
und jedes Mal, wenn eine Aktion ausgeführt wird, wird der Haltepunkt innerhalb desApplicationController
- unabhängig von seinem " aktuellen " Controller erreicht.Ich initialisiere meinen Agenten (der als mein Kontext fungiert), wenn mein Controller wie folgt erstellt wird:
Dies ist offensichtlich nicht das, was Sie brauchen - wie Sie erwähnt haben, wollten Sie bei jedem Aufruf nur eine einzige Instanz. Es ist jedoch ein guter Ort, um zu überprüfen, was jedes Mal vor sich geht, und um sicherzustellen, dass derzeit keine andere Instanz Ihres Kontexts vorhanden ist.
Hoffe das hilft.
quelle
Controller werden für jede Anforderung erstellt. Die Magie geschieht im Routing in der Datei gobal.aspx. Die Zuordnungspfade leiten MVC an die zu erstellende Steuerung und die Aktion auf der aufzurufenden Steuerung sowie die an sie zu übergebenden Parameter.
http://www.asp.net/mvc/tutorials/asp-net-mvc-routing-overview-vb
quelle