Pertanyaan yang sangat sederhana: Apakah pengontrol di ASP.NET dibuat untuk setiap permintaan HTTP, atau apakah mereka dibuat saat startup aplikasi dan digunakan kembali di seluruh permintaan?
Akankah pengontrol dibuat hanya untuk permintaan HTTP tertentu?
Jika asumsi saya sebelumnya benar, dapatkah saya bergantung padanya? Saya ingin membuat konteks database (Entity Framework) yang hanya akan hidup untuk satu permintaan. Jika saya membuatnya sebagai properti yang diinisialisasi di konstruktor pengontrol, apakah diberikan bahwa contoh konteks baru akan dibuat untuk setiap permintaan?
Jawaban:
Kontroler dibuat untuk setiap permintaan oleh
ControllerFactory
(yang secara default adalahDefaultControllerFactory
).http://msdn.microsoft.com/en-us/library/system.web.mvc.defaultcontrollerfactory.aspx
Perhatikan bahwa
Html.Action
Pembantu Html akan membuat pengontrol lain.Versi singkatnya adalah yang
ControllerActivator.Create
disebut (untuk setiap permintaan) untuk membuat Controller (yang menginisi Controller baru baik melalui DependencyResolver atau melalui Activator jika tidak ada Resolver yang telah diatur):Versi yang lebih panjang adalah ini (Berikut kode dari sumber dari MvcHandler):
Berikut kode pabrik Controller:
Yang pada dasarnya menyebut ini:
Yang memanggil metode ini di
ControllerActivator
(Kode ini mencoba meminta DependencyResolver untuk sebuah instance, atau hanya menggunakan kelas Activator):Ini mungkin berada di bawah terlalu banyak informasi ... Tapi saya ingin menunjukkan bahwa Anda benar-benar DO mendapatkan pengontrol baru untuk SETIAP permintaan.
sumber
Saya membuat konstruktor kosong untuk pengontrol dan meletakkan titik henti di konstruktor. Itu dipukul setiap kali ada permintaan baru. Jadi saya pikir itu dibuat untuk setiap permintaan.
sumber
Html.RenderAction("action", "controller");
)Pengontrol akan dibuat ketika Tindakan apa pun dalam Pengontrol tertentu dilakukan.
Saya memiliki proyek di mana semua Pengontrol saya mewarisi dari
ApplicationController
dan setiap kali tindakan dilakukan, breakpoint terkena di dalamApplicationController
- terlepas dari Pengontrol " saat ini ".Saya menginisialisasi agen saya (yang berfungsi sebagai konteks saya) setiap kali pengontrol saya dibuat seperti:
Ini jelas bukan yang Anda butuhkan - seperti yang Anda sebutkan bahwa Anda hanya menginginkan satu contoh setiap kali dipanggil. Tetapi ini adalah tempat yang baik untuk memeriksa apa yang terjadi setiap saat dan untuk memastikan bahwa contoh lain dari konteks Anda saat ini tidak ada.
Semoga ini membantu.
sumber
Pengontrol dibuat untuk setiap permintaan. Keajaiban terjadi dalam perutean di gobal.aspx. Jalur pemetaan mengarahkan MVC ke pengontrol mana yang akan dibuat dan ditindaklanjuti pada pengontrol untuk dipanggil, dan parameter untuk diteruskan ke mereka.
http://www.asp.net/mvc/tutorials/asp-net-mvc-routing-overview-vb
sumber