2012-07-12 7 views
6

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); 
} 

डिफ़ॉल्ट कार्यनीति ओवरराइड कई परतों के माध्यम से प्रारंभकर्ता गुजर, हालांकि शामिल हो सकता है:

वैकल्पिक तर्क एक संभावना है।

हमने एक प्रतिबिंब-आधारित प्रारंभकर्ता बनाने पर भी विचार किया है जो सभी संदर्भों को एक विशिष्ट रणनीति में सेट करेगा।

सबसे अच्छा अभ्यास क्या है?

उत्तर

6

एक डीबीसीएन्टेक्स्टबूटस्ट्रैप क्लास बनाने के बारे में जो आप प्रत्येक प्रोजेक्ट के ग्लोबल.एक्सएक्स में तत्काल कर सकते हैं; जो इसके कार्यान्वयन में प्रत्येक संदर्भ के लिए प्रारंभकर्ता सेट करता है।

इस तरह यदि आप एक नया dbcontext जोड़ते हैं तो आपको केवल बूटस्ट्रैपर में परिवर्तन करना होगा, न कि प्रत्येक प्रोजेक्ट में।

+0

धन्यवाद! इस और अधिक चर्चा की कोशिश करने के बाद, हमने उन स्थानों पर प्रारंभिक सेटिंग स्थापित करने का निर्णय लिया जहां डीबीकॉन्टेक्स बनाया जा रहा है (या जहां एक डीआई/आईओसी कंटेनर कॉन्फ़िगर किया जा रहा है)। उस समय, हम जानते हैं कि संदर्भ क्या हैं। तो मेरा मूल सवाल दोषपूर्ण धारणाओं पर आधारित था। – TrueWill

2

ईएफ 4.3 (और नए) में define initializer from configuration file की संभावना भी शामिल है, इसलिए आपको इसे कोड में सेट करने की आवश्यकता नहीं होगी, लेकिन फिर भी आपको कई कॉन्फ़िगरेशन बनाए रखने की आवश्यकता होगी।

@ हसन की सलाह आपके लिए सबसे अच्छा समाधान की तरह दिखती है।

संबंधित मुद्दे