ASP.net Web-API: Warum sind Controller erstellt pro Anfrage?
Mike Wasson Artikel "Dependency Injection für Web-API-Controller" auf www.asp.net sagt:
Dependenecy Umfang und Controller-Lebensdauer
Controller erstellt werden pro Anfrage...
Bin ich richtig in dem Verständnis, dass ASP.NET Web-API erstellt eine neue controller-Instanz (und befriedigt Ihre Abhängigkeiten) für jede eingehende Anforderung?
Ist dieser Ansatz nicht verschwenderisch, es schafft und zerstört viele Instanzen der controller, wenn in der Theorie eine einzelne Instanz verwendet werden könnte, für alle Anforderungen?
Theoretisch, sicher; aber Objekt-Schaffung (und Zerstörung).NET ist nicht teuer überhaupt. Controller in ASP.NET MVC (und WebAPI) sind relativ einfache Objekte, sicherlich die Instanziierung der alten Web-Formulars
Es gibt auch praktische Probleme mit dem halten einer stateful-controller: Sie müssten zusätzliche Arbeit durchführen, separate pro-Anfrage Aufräumarbeiten (z.B. DB-verbindungen) und pro-Instanz-Bereinigung (z.B. Controller-Status). Es gibt auch Probleme mit der Reentranz und Parallelität (ASP.NET verwendet einen anderen thread für jede Anforderung). Es ist sicherlich einfacher und zuverlässiger, um ein einzelnes controller-Instanz für jede Anforderung.
Da HTTP ein zustandsloses Protokoll ist es ein natürlicher Weg, um die Anforderungen in einer Staatenlosen Art und Weise ...
Page
für jede Anforderung ist wahrscheinlich viel teurer.Es gibt auch praktische Probleme mit dem halten einer stateful-controller: Sie müssten zusätzliche Arbeit durchführen, separate pro-Anfrage Aufräumarbeiten (z.B. DB-verbindungen) und pro-Instanz-Bereinigung (z.B. Controller-Status). Es gibt auch Probleme mit der Reentranz und Parallelität (ASP.NET verwendet einen anderen thread für jede Anforderung). Es ist sicherlich einfacher und zuverlässiger, um ein einzelnes controller-Instanz für jede Anforderung.
Da HTTP ein zustandsloses Protokoll ist es ein natürlicher Weg, um die Anforderungen in einer Staatenlosen Art und Weise ...
InformationsquelleAutor urig | 2014-08-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen controller enthält Informationen (Staat) über die eingehende Anfrage.
Wenn du nur einen controller mit vielen Anfragen dann würden Sie alle verwirrt werden und der Benutzer würde wahrscheinlich bekommen einige seltsame Ergebnisse.
Nun, zum einen die Anfrage Eigenschaft.
Es brauchte nicht so zu sein. Alle Anfragen, die Staat kommt zunächst aus dem HttpContext, die effektiv mit thread local storage. Aber ich bin glücklich mit dieser Wahl, denn es verringert die chance von Problemen, die durch Instanz-Felder.
"Alle Anfragen, die Staat kommt zunächst aus dem HttpContext": das ist falsch. Web-Api verwendet seine eigene action/controller/Anfrage zusammenhängen, bevölkert von den Rahmen, auf jede eingehende Anfrage und hängt nicht von der
System.Web
dll. (d.h. Sie können selbst hosten einer Web-Api-Projekt).nicht überzeugt sind, wenn wir nicht die Aufrechterhaltung einer Instanz-Variablen/Zustand im controller dann wie "Benutzer würde wahrscheinlich bekommen einige seltsame Ergebnisse." ?
InformationsquelleAutor Rowan Freeman
Wenn es nicht neu erstellt jede Anforderung, die Sie würde effektiv ein singleton oder statische Klasse, was bedeutet, dass Sie müssten zu behandeln, zurücksetzen der Klassen-Staat auf Ausnahmen und alle möglichen anderen Fälle. Das Ergebnis würde mit ziemlicher Sicherheit bedeuten bugs.
Den Aufwand für das erstellen eines neuen Kontextes, jedes mal ist ein kleiner Preis zu zahlen für besseren code, bessere Wartbarkeit.
InformationsquelleAutor rolls