Bardzo proste pytanie: czy kontrolery w ASP.NET są tworzone dla każdego żądania HTTP, czy też są tworzone podczas uruchamiania aplikacji i ponownie wykorzystywane we wszystkich żądaniach?
Czy kontroler zostanie utworzony tylko dla konkretnego żądania HTTP?
Jeśli moje wcześniejsze założenia są prawidłowe, czy mogę na tym polegać? Chcę utworzyć kontekst bazy danych (Entity Framework), który będzie działać tylko dla jednego żądania. Jeśli utworzę ją jako właściwość zainicjowaną w konstruktorze kontrolera, czy zostanie przyznane, że nowe wystąpienie kontekstu zostanie utworzone dla każdego żądania?
Odpowiedzi:
Kontroler jest tworzony dla każdego żądania przez
ControllerFactory
(domyślnieDefaultControllerFactory
).http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx
Zwróć uwagę, że
Html.Action
pomocnik Html utworzy inny kontroler.Krótka wersja jest
ControllerActivator.Create
wywoływana (dla każdego żądania) w celu utworzenia kontrolera (który inicjuje nowy kontroler za pośrednictwem DependencyResolver lub aktywatora, jeśli nie skonfigurowano Resolvera):Dłuższa wersja jest następująca (oto kod ze źródła z MvcHandler):
Oto kod fabryczny kontrolera:
Co w zasadzie nazywa to:
Który wywołuje tę metodę w
ControllerActivator
(ten kod próbuje zapytać DependencyResolver o instancję lub po prostu używa klasy Activator):To może zawierać zbyt wiele informacji ... Ale chciałem pokazać, że naprawdę otrzymujesz nowy kontroler do KAŻDEJ prośby.
źródło
Utworzyłem pusty konstruktor dla kontrolera i umieściłem punkt przerwania w konstruktorze. Został trafiony za każdym razem, gdy było nowe żądanie. Więc myślę, że jest tworzony na każde żądanie.
źródło
Html.RenderAction("action", "controller");
)Kontroler zostanie utworzony, gdy zostanie wykonana dowolna akcja w określonym kontrolerze.
Mam projekt, w którym wszystkie moje kontrolery dziedziczą po
ApplicationController
i za każdym razem, gdy wykonywana jest akcja, punkt przerwania jest trafiany wewnątrzApplicationController
- niezależnie od jego „ bieżącego ” kontrolera.Inicjalizuję mojego agenta (który działa jako mój kontekst) za każdym razem, gdy mój kontroler jest tworzony w następujący sposób:
To oczywiście nie jest to, czego potrzebujesz - jak wspomniałeś, że chciałeś mieć tylko jedną instancję za każdym razem, gdy jest wywoływana. Ale jest to dobre miejsce, aby za każdym razem sprawdzić, co się dzieje i upewnić się, że inna instancja kontekstu obecnie nie istnieje.
Mam nadzieję że to pomoże.
źródło
Kontrolery są tworzone na każde żądanie. Magia dzieje się w routingu w gobal.aspx. Ścieżki mapowania kierują MVC do kontrolera, który ma zostać utworzony i akcji na kontrolerze do wywołania, oraz parametrów do przekazania do nich.
http://www.asp.net/mvc/tutorials/asp-net-mvc-routing-overview-vb
źródło