2009-11-19 18 views
50

Her web isteği sırasında bir denetleyici yapıcısının çağrılmadığı anlaşılıyor. Bunun doğru olduğunu varsayarsak, bir denetleyicinin yaşam döngüsü nedir? Uygulamanın başlangıcında "yapılandırıldı", sonra önbelleğe alınır ve her bir web isteğiyle ona gönderilen requestcontext ile çağrılır mı?ASP.NET MVC Denetleyici Kullanım Döngüsü

Açıkçası, kurucu davranışını nasıl taklit etmeyeceğimi sormuyorum, normalde yapıcıda yapacağım şeyleri başlatmak için OnActionExecuting olayını kullanıyorum. Ayrıca, birim ve sistem testi için kontrolörler üzerinde kurucular kullanıyorum.

Teşekkürler!

cevap

74

default controller factory'u kullanırsanız, her istek için yeni bir örnek oluşturulacak ve olması gerektiği şekilde oluşturulacaktır. Denetleyiciler farklı istekler arasında paylaşılmamalıdır. Kontrolörlerin ömrünü yöneten özel bir fabrika yazabilirsiniz.

+10

Neden olsa? Niye ya? –

+2

Kendime bunun neden ve nasıl olması gerektiğine kendimi batırdım ve öğrettim. EF kullanarak okuma/yazma eylemleri ve görünümleri ile denetleyiciler oluşturuyordum. Oluşturulan kod, EF Context örneği için özel bir örnek değişkeni oluşturdu. Akıllı olacağımı ve bunu statik bir değişken yapacağımı düşündüm. Sorun şu ki, bu denetleyicinin kapsamı dışındaki bir şey veritabanını değiştirirse, statik bağlam asla bilemez. Şimdi bir örnek değişkeni olarak bırakıyorum ve her bir istekle yeni bir örnek oluşturulduğundan, içerik veritabanında herhangi bir değişiklik görebiliyor. – ThatAintWorking

+1

Tüm durumun parametreler içinde (yani işlevsel bir stilde) bulunduğu bir Web API'sinde, bir denetleyicinin neden yeniden kullanılamayacağı konusunda bir neden yoktur (görebildiğim). Tasarım gereği iplik güvenlidir. API vatansız olduğu için –

10

Korkarım ki, anlayışınız yanlış. Her bir web isteği için bir kontrolör (çok ince ve hafif bir sınıf olmalı ve herhangi bir oturumda çıkış durumu olmamalıdır) aslında anında oluşturulur. Bir denetleyici örneği belirli bir görünüme özgü nasıl olabilir?

Böylece her yapmanız talep için

1

bir kontrolör oluşturulur ... Bir "yaşam döngüsü" (isteğin dışında) diye bir şey yoktur. Bir örnek alalım.

public class ExampleController : Controller{ 
      public static userName; 

      public void Action1(){//do stuff} 
      public void Action2(){//do stuff} 
      public void AssignUserName(string username){ 
       userName = username; 

      } 
      public string GetName(){ return userName;} 


    } 

Artık denetleyiciyi, kullanıcı adını geçen görünümden arayabilirsiniz. Bir sonraki istekte ayarladığınız kullanıcı adını almayı umuyoruz. null döndürecek. Böylece her talep için yeni bir kontrolör oluşturulur. MVC'de bir nesneyi, bir nesneyi bir sınıftan ayırmak gibi bir uygulama başlatmazsınız. Basitçe, diğer nesnelerle yaptığınız gibi aramak için denetleyici nesnesi bellek işaretçisine sahip değilsiniz.

Bu bağlantıya gidin. MVC kontrol cihazının kullanım ömrü hakkında iyi bir açıklama var.

ASP.Net MVC - Request Life Cycle

İlgili konular