2010-02-11 7 views
11

.NET आपको एप्लिकेशन सेटिंग्स प्रबंधित करने के लिए .settings फ़ाइलों का उपयोग करने की अनुमति देता है।.NET में विभिन्न वातावरण के लिए अलग-अलग सेटिंग्स सेटिंग्स का उपयोग कैसे करें?

EnvironmentSettings environmentSettings; 

// get the current environment (Production, Development or Test) 
ApplicationEnvironment Environment = (ApplicationEnvironment) 
    Enum.Parse(typeof(ApplicationEnvironment), Settings.Default.ApplicationEnvironment); 

switch (Environment) 
{ 
    case ApplicationEnvironment.Production: 
     environmentSettings = Settings.Production; 
     break; 
    ... 
} 

string reportOutputLocation = environmentSettings.ReportOutputLocation; 

असल में, मैं दो अलग सेटिंग्स कक्षाएं हैं:: मैं एक तरीका है कि मैं इस तरह कुछ कर सकते हैं में अलग से उत्पादन, विकास और टेस्ट सेटिंग्स को संग्रहीत करना चाहते हैं सामान्य सेटिंग्स वर्ग है कि चयनित पर्यावरण और गैर संग्रहीत करता है पर्यावरण विशिष्ट गुण, और पर्यावरण वर्ग नामक दूसरी कक्षा के 3 स्थैतिक उदाहरण। इस्तेमाल किया गया उदाहरण सामान्य सेटिंग्स वर्ग में निर्दिष्ट पर्यावरण पर निर्भर होना चाहिए।

क्या स्थिर इन कन्स्ट्रक्टर या कुछ में इन सभी सेटिंग्स के मानों को मैन्युअल रूप से सेट करने का कोई तरीका है? अगर मुझे ऐसा करना है, तो मेरे पास "DevOutputLocation", "LiveOutputLocation", आदि जैसे गुणों के साथ एक बड़ी सेटिंग क्लास होगी,

मेरे पास मेरे प्रोजेक्ट में एकाधिक। सेटिंग्स फ़ाइलें हो सकती हैं लेकिन यह सिर्फ अलग-अलग कक्षाएं बनाती है जो एक-दूसरे से नहीं निकलते हैं। इसलिए मैं डेवलपमेंट सेटिंग्स, सेटिंग्स, प्रोडक्शन सेटिंग्स, सेटिंग्स और टेस्टसेटिंग.सेटिंग फाइलें बना सकता हूं और उन्हें वही गुण दे सकता हूं, लेकिन फिर मुझे यह निर्धारित करने के लिए हर वर्ग स्विच कथन की आवश्यकता होगी कि वे किस वर्ग का उपयोग करें क्योंकि वे एक सामान्य वर्ग से नहीं निकलते हैं । एक ही कुंजी को शामिल करते साथ;

+0

आप प्रत्येक पर्यावरण के लिए एक अलग उपयोगकर्ता का उपयोग कर ऐसा कर सकते हैं, लेकिन किसी भी तरह से मुझे लगता है कि इससे हल होने की तुलना में अधिक समस्याएं होती हैं। –

उत्तर

2

मैं .config फ़ाइलों के लिए इस दृष्टिकोण का उपयोग कर रहा हूं, मुझे यकीन है कि यह आपकी भी मदद करेगा।बस Scott Hanselman's blog post और this question पर देखें। विचारधारा नरक की तरह सरल है, लेकिन बहुत अच्छा काम करता है। आप सभी की आवश्यकता होगी:

  1. सम्मेलन, उदा उन्हें अलग अलग विन्यास के लिए कई फ़ाइलों को बनाने के
  2. नाम my.dev.settings, my.live.settings
  3. पोस्ट का निर्माण घटना बनाने सेटिंग्स हमेशा डिफ़ॉल्ट सेटिंग्स में दिखेगा के साथ वर्ग के लिए (लिंक देखें)
  4. का आनंद =)

प्रारंभ कोड (जो होगा आवश्यक निर्माण के साथ प्रत्येक निर्माण के बाद प्रतिस्थापित किया जाना चाहिए), इसलिए इस दृष्टिकोण को न्यूनतम प्रयास की आवश्यकता है।

+0

क्या यह वास्तव में एकमात्र तरीका है? मुझे लगता है कि अगर यह स्कॉट एच द्वारा अनुमोदित है। यह वास्तव में एक गन्दा हैक की तरह लगता है। आपको लगता है कि आप प्रत्येक बिल्ड कॉन्फ़िगरेशन के लिए उपयोग करने के लिए .settings या .config फ़ाइल निर्दिष्ट कर सकते हैं। – Carl

+0

मैं अपने पहले से पूछे जाने वाले प्रश्नों के माध्यम से वापस जा रहा था और देखा कि मैंने कभी इसे उत्तर के रूप में चिह्नित नहीं किया है, इसलिए आप वहां जाएं। एक बार फिर धन्यवाद। – Carl

+0

एक और संभावना है कि एक एक्सएमएल ट्रांसफॉर्म टूल का उपयोग करना है जैसे [SlowCheetah] (https://visualstudiogallery.msdn.microsoft.com/69023d00-a4f9-4a34-a6cd-7e854ba318b5) –

0

बस एक विचार है, लेकिन यह काम कर सकते हैं ...

  • आप N + 2 सेटिंग्स फ़ाइलों (2 स्वामी एन अलग बनाता है) की आवश्यकता होगी।

  • उन सभी के लिए "कस्टम टूल" संपत्ति साफ़ करें लेकिन स्वामी में से एक (इसलिए केवल मास्टर उत्पन्न करता है)।

  • बिल्ड-मास्टर फ़ाइल में उचित सेटिंग्स फ़ाइल सामग्री की प्रतिलिपि बनाने के लिए प्रत्येक रिलीज के लिए प्री-बिल्ड स्क्रिप्ट संशोधित करें।

  • द्वितीय मास्टर फ़ाइल सामग्री को मूल मास्टर फ़ाइल में वापस कॉपी करने के लिए पोस्ट-बिल्ड स्क्रिप्ट को संशोधित करें।

नोट: यदि आप अपने स्रोत नियंत्रण प्रदाता के साथ काम कर सकते हैं पूर्व और लिपियों के बाद का निर्माण, आप एक माध्यमिक गुरु की जरूरत नहीं है - तुम सिर्फ पूर्व निर्माण में बाहर की जाँच और पूर्ववत कर सकते हैं पोस्ट-बिल्ड में देखें। हालांकि, इससे निरंतर एकीकरण वातावरण में समस्याएं हो सकती हैं क्योंकि लॉक फ़ाइल को निर्माण विफल होने की आवश्यकता होगी।

मैंने यह भी कभी नहीं किया है; हालांकि कई बार मैं चाहता था कि वीएस में ऐसा कुछ करने का एक और आगे का रास्ता था।

2

एक विचार यह है कि स्थिर मूल्यों की एक श्रृंखला के बीच स्विचिंग चीजों को करने का एक बेहतर तरीका लगता है। मैं सिंगलटन पैटर्न को देखने का सुझाव दूंगा। यह पैटर्न आपको एक एकल वर्ग उदाहरण देता है जिसे कक्षा के सभी संदर्भों के बीच साझा किया जाता है, लेकिन जब इसे पहली बार लोड किया जाता है तो आप अपने सामान्य प्रारंभिक बिट्स को अपने पर्यावरण की जांच करने और मूल्यों को तदनुसार सेट करने के लिए कर सकते हैं।

समान रूप से, विभिन्न वर्गों पर कार्य करने के लिए स्विच का उपयोग करने के बजाय, क्या आप एक इंटरफ़ेस को डिज़ाइन करने की तलाश नहीं करेंगे, और प्रत्येक वर्ग को उस इंटरफ़ेस को लागू करना होगा?

0

बस नेट पर्यावरण आधारित config फ़ाइलों पर कुछ अतिरिक्त जानकारी अपने ऊपर कार्यान्वयन विशेष रूप से उपयोग किए बिना: Summary

विजुअल स्टूडियो 2010 इस सुविधा होगा:

उद्यम पुस्तकालय V3.0 के बाद से इस सुविधा है भी। इसे Config Transformation

1

यह निर्धारित करने के लिए जांच करने में थोड़ा अधिक ओवरहेड है कि आप किस माहौल में चल रहे हैं। यदि आप एक वेब वातावरण की बात कर रहे हैं तो इसका मतलब महत्वपूर्ण प्रदर्शन हिट हो सकता है। मैं तीन अलग-अलग कॉन्फ़िगरेशन फ़ाइलों को बनाने और एक सतत एकीकरण और तैनाती प्रणाली स्थापित करने की अनुशंसा करता हूं जो पर्यावरण के आधार पर उचित सेटिंग फ़ाइल के नामकरण और रोल को संभालता है। आपके मामले में आपके पास तीन फाइलें होंगी, Production.config, Development.config, और Test.config। एकीकरण सर्वर तब पर्यावरण पर आधारित web.config या app.config के लिए इस फ़ाइल की एक प्रति बना देगा।

जब तक कोई कॉन्फ़िगरेशन परिवर्तन नहीं किया जाता है, तब तक तीन अलग-अलग फ़ाइलों को बनाए रखने के साथ कोई अतिरिक्त रखरखाव शामिल होता है, हम फ़ाइलों को स्वतः स्वरूपित करते हैं और आसानी से अंतर देखने और उन्हें उचित सिंक में रखने के लिए WinMerge जैसे कुछ का उपयोग करते हैं। इन प्रकार की फाइलों को आम तौर पर कई बदलावों की आवश्यकता नहीं होती है और जब वे करते हैं तो वे आम तौर पर मामूली जोड़ होते हैं।

1

मैं वर्तमान में पीडीवीआई द्वारा उल्लिखित समाधान के समान कुछ करता हूं। लेकिन एकाधिक कॉन्फ़िगरेशन फ़ाइलों को सरल बनाने के लिए मैं पर्यावरण विशिष्ट कॉन्फ़िगरेशन फ़ाइलों को बनाने के लिए एक T4 टेम्पलेट का उपयोग करता हूं। इस तरह एक web.tt फ़ाइल है जो डिफ़ॉल्ट web.config फ़ाइल की पीढ़ी को संभालती है। प्रत्येक पर्यावरण की अपनी टेम्पलेट फ़ाइल (qa.tt, production.tt, आदि) होती है जो web.tt से प्राप्त होती है और इसमें कोई भी पर्यावरण विशिष्ट ओवरराइड होता है। वेब कॉन्फ़िगरेशन में कोई भी परिवर्तन - नई ऐप सेटिंग्स, कॉन्फ़िगरेशन सेटिंग्स इत्यादि टेम्पलेट को पुन: उत्पन्न करके स्वचालित रूप से सभी क्षेत्र विशिष्ट कॉन्फ़िगरेशन फ़ाइलों के लिए प्रचारित की जाती हैं, और आपको फ़ाइलों को एक diff टूल का उपयोग करके सिंक में रखने के बारे में चिंता करने की आवश्यकता नहीं है।