मैं एक आधार नियंत्रक का उपयोग करता हूं जो एक DataBase
संपत्ति को उजागर करता है जो व्युत्पन्न नियंत्रक तक पहुंच सकता है।
public abstract class BaseController : Controller
{
public BaseController()
{
Database = new DatabaseContext();
}
protected DatabaseContext Database { get; set; }
protected override void Dispose(bool disposing)
{
Database.Dispose();
base.Dispose(disposing);
}
}
मेरे आवेदन में सभी नियंत्रकों से व्युत्पन्न BaseController
और इस तरह से उपयोग किया जाता है:
public class UserController : BaseController
{
[HttpGet]
public ActionResult Index()
{
return View(Database.Users.OrderBy(p => p.Name).ToList());
}
}
अब आपके सवालों का जवाब देने के लिए:
मुझे एक नया DbContext कब बनाना चाहिए / क्या मेरे पास एक वैश्विक संदर्भ होना चाहिए जिससे मैं गुजरता हूं?
संदर्भ प्रति अनुरोध बनाया जाना चाहिए। संदर्भ बनाएं, आपको इसके साथ क्या करना है, उससे छुटकारा पाएं। आधार वर्ग समाधान के साथ मैं आपको केवल संदर्भ का उपयोग करने के बारे में चिंता करने की आवश्यकता है।
कोशिश मत करो और एक वैश्विक संदर्भ है (यह नहीं है कि वेब अनुप्रयोग कैसे काम करते हैं)।
क्या मेरे पास एक वैश्विक संदर्भ हो सकता है जिसका मैं सभी स्थानों पर पुन: उपयोग करूं?
नहीं, यदि आप इसके चारों ओर एक संदर्भ रखते हैं, तो यह सभी अपडेट, परिवर्धन, विलोपन आदि का ट्रैक रखेगा और यह आपके एप्लिकेशन को धीमा कर देगा और यहां तक कि आपके एप्लिकेशन में कुछ सूक्ष्म कीड़े दिखाई दे सकते हैं।
आपको शायद अपने नियंत्रक के लिए अपने भंडार या अपने संदर्भ को उजागर करने के लिए चुना जाना चाहिए, लेकिन दोनों नहीं। दो संदर्भों का एक ही विधि से अभिगम होने पर बग्स का नेतृत्व करने जा रहे हैं यदि उनके पास आवेदन की वर्तमान स्थिति के बारे में अलग-अलग विचार हैं।
व्यक्तिगत रूप से, मैं DbContext
सीधे सबसे अधिक रिपॉजिटरी उदाहरणों के रूप में उजागर करना पसंद करता हूं, जिन्हें मैंने DbContext
वैसे भी पतले रैपर के रूप में देखा है।
क्या इससे प्रदर्शन प्रभावित होता है?
पहली बार DbContext
बनाया गया यह काफी महंगा है, लेकिन एक बार ऐसा करने के बाद बहुत सारी जानकारी कैश्ड हो जाती है, ताकि बाद के इंस्टेंटेशन बहुत जल्दी हो जाएं। आपके द्वारा अपने डेटाबेस तक पहुँच की आवश्यकता होने पर हर बार एक के बाद एक संदर्भ रखने से आप प्रदर्शन समस्याओं को देख सकते हैं।
हर कोई ऐसा कैसे कर रहा है?
निर्भर करता है।
कुछ लोग इसे बनाए जाने पर अपने नियंत्रक के संदर्भ के ठोस उदाहरण को पारित करने के लिए एक निर्भरता इंजेक्शन ढांचे का उपयोग करना पसंद करते हैं। दोनों विकल्प ठीक हैं। एक छोटे पैमाने के अनुप्रयोग के लिए मेरा अधिक उपयुक्त है जहाँ आप जानते हैं कि जिस विशिष्ट डेटाबेस का उपयोग किया जा रहा है वह बदलने वाला नहीं है।
कुछ लोग यह तर्क दे सकते हैं कि आप यह नहीं जान सकते हैं और यही कारण है कि निर्भरता इंजेक्शन विधि बेहतर है क्योंकि यह आपके आवेदन को बदलने के लिए अधिक लचीला बनाता है। इस पर मेरी राय है कि यह शायद नहीं बदलेगा (एसक्यूएल सर्वर और एंटिटी फ्रेमवर्क शायद ही अस्पष्ट हो) और मेरा समय उस कोड को लिखने में सबसे अच्छा समय बिताया है जो मेरे आवेदन के लिए विशिष्ट है।