canonical answerDatabase.SetInitializer
कॉल कहां रखा जाए, वेब परियोजनाओं के लिए Global.asax
में है। मैं एक और विकल्प की तलाश में हूं।डाटाबेस के साथ शॉटगन सर्जरी से बचें .etInitializer
हम कोड प्रथम के साथ इकाई फ्रेमवर्क 4.3.1 का उपयोग कर रहे हैं। हम वेब सेवाओं और WinForms अनुप्रयोगों को लिखते हैं, और आम तौर पर साझा पुस्तकालयों में डेटा एक्सेस कोड (जैसे डीबीकॉन्टेक्स) डालते हैं।
वर्तमान में, हमारे DbContext वंश के कंस्ट्रक्टर्स इस तरह दिखेगा: समय की
public PricingContext(string connectionString)
: base(connectionString)
{
Database.SetInitializer<PricingContext>(null);
}
95%, यह सही डिफ़ॉल्ट है। 5% समय (कुछ एकीकरण परीक्षण, ग्रीनफील्ड विकास, आदि) यह नहीं है।
यदि हम उस कोड को हमारी सेवाओं और अनुप्रयोगों के प्रारंभिकरण (या कॉन्फ़िगरेशन) में ले जाते हैं, तो लाइब्रेरी में एक नया डीबीकॉन्टेक्स्ट जोड़ने से Shotgun Surgery शामिल है। इन सभी परियोजनाओं को अद्यतन किया जाना चाहिए, भले ही पुस्तकालय सीधे संदर्भ का पर्दाफाश न करे।
public PricingContext(string connectionString,
IDatabaseInitializer<PricingContext> databaseInitializer = null)
: base(connectionString)
{
Database.SetInitializer<PricingContext>(databaseInitializer);
}
डिफ़ॉल्ट कार्यनीति ओवरराइड कई परतों के माध्यम से प्रारंभकर्ता गुजर, हालांकि शामिल हो सकता है:
वैकल्पिक तर्क एक संभावना है।
हमने एक प्रतिबिंब-आधारित प्रारंभकर्ता बनाने पर भी विचार किया है जो सभी संदर्भों को एक विशिष्ट रणनीति में सेट करेगा।
सबसे अच्छा अभ्यास क्या है?
धन्यवाद! इस और अधिक चर्चा की कोशिश करने के बाद, हमने उन स्थानों पर प्रारंभिक सेटिंग स्थापित करने का निर्णय लिया जहां डीबीकॉन्टेक्स बनाया जा रहा है (या जहां एक डीआई/आईओसी कंटेनर कॉन्फ़िगर किया जा रहा है)। उस समय, हम जानते हैं कि संदर्भ क्या हैं। तो मेरा मूल सवाल दोषपूर्ण धारणाओं पर आधारित था। – TrueWill