2011-01-31 17 views
5

Açıkçası hem C# hem de Asp.net MVC'de yeni başlayan biriyim. Ayrıca asp.net web uygulamasının gerçekte olayın arkasındaki IIS ve ASP.NET çerçevesinde nasıl çalıştığını da bilmiyorum.Denetleyici sınıfındaki DbContext örneğine karşı Global.asax'ta DbContext statik alanı?

Asp.net mvc uygulamasında DbContext (veya DbContext'ten türeyen herhangi bir sınıf) alanını bildirmek zorunda olduğum kararla kafam karıştı.

  1. tüm kontrolörler bunu yararlanabilir öyle ki global.asax içindeki statik alan olarak alanı bildirmek:

    iki seçeneğim var.

  2. Alanı, her denetleyici sınıfının bir örnek alanı olarak bildirin.

Hangisinin doğru olduğunu açıklayabilir misiniz? Daha detaylı açıklama gerçekten gerekli.

cevap

8

Global.asax'ta statik bir alan yaparsanız, eşzamanlılık sorunları yaşayacaksınız. Birden çok isteğin birden fazla iş parçacığı içeri girebilir ve birbirlerinin verilerini alabilir. Daha da kötüsü, web sitenizde daha fazla trafik almaya başlayana veya yükleme testine başlayana kadar bu durumun görünmeyeceği anlamına gelir. Bunu bir singleton olarak uygulayacaksınız, hepsi testinizde iyi çalışıyor olacak ve "Ben bir dahiyim! Bu uygulamanın ne kadar temiz olduğunu görün!" Ama bir gün, bende olduğu gibi, bunun tarafından yakılacaksın. Sonuçlar karışık olacak, kullanıcılar kendilerine ait olmayan verileri görmeye başlayacak ve web sitesi beklenmedik şekilde davranacaktır.

Hem Entity Framework hem de SQL için LINQ için bağlam sınıfları, çalıştırmak istediğiniz her sorgu kümesi için ayarladığınız hafif bir örnekleme olarak tasarlandı. Uzun ömürlü olması gerekmiyor. Ben tüm uygulama için (DBContext türetilen veya sınıf) DBContext tek bir örneği kullanmak durumunda

Check out this other Stack Overflow question/answer on the same topic, worded differently.

4

İkinci seçenekle gitmelisiniz. yani kontrol cihazında beyan ve kullanın. DBContext'i global.asax'ta statik bir alan olarak yerleştirirseniz, temel olarak uygulamanın tamamı için tek bir örnek oluşturursunuz.

Diğer taraftan, ikinci seçenekle her istek için bir DBcontext dosyanız vardır. Her eylem yönteminde DBContext'i almak için bağımlılık enjeksiyonu kullanabilmeniz daha iyi olur.

+0

dezavantajı nedir? – LaTeX

+2

@Stack Overflow - veritabanı bağlantıları açısından "singletons" üzerinde okumak ve neden kötülük olduğunu. – RPM1984

İlgili konular