c# - कॉन्फ़िगरेशन जानकारी कहाँ स्टोर करना है




.net configuration (3)

XmlDocument - आप XSD.exe का उपयोग कर एक वर्ग परिभाषा उत्पन्न कर सकते हैं

मेरे पास एक कंसोल एप्लिकेशन है जो मैं सी से सी # पर पुनर्निर्माण कर रहा हूँ यह एप्लिकेशन कमांड लाइन से मापदंडों जैसे फाइलों को संग्रहीत करने की विरासत विधि का समर्थन करने में सक्षम हो सकता है और एक फ़ाइल से पैरामीटर (जिसे सिस्टम पैरामीटर कहा जाता है) जो हर रन को कस्टमाइज़ करते हैं। सिस्टम पैरामीटर फ़ाइल सादा-पाठ में एक सरल कुंजी के साथ है: मान संरचना।

मेरे प्रश्न हैं:

  • क्या मैं एक एकल विन्यास ऑब्जेक्ट में इन विभिन्न मापदंडों को संयोजित करूँ?
  • मैं इस कॉन्फ़िगरेशन ऑब्जेक्ट को कोड से पैरामीटर स्टोर करने के लिए कैसे कॉल करूं?
  • पैरामीटर प्राप्त करने के लिए मैं कोड से इस कॉन्फ़िगरेशन वस्तु को कैसे कॉल करूं?
    • क्या यह ऑब्जेक्ट जोरदार टाइप किया जाना चाहिए?
  • कोड में बहुत से विभिन्न स्थानों से मुझे इस संरचना तक पहुंच की आवश्यकता होगी, ऑब्जेक्ट में मूल्यों को हर जगह चारों तरफ बिना गुजरने के लिए सबसे खूबसूरत तरीका क्या है?

मुझे लगता है कि यह एक एकल, दृढ़ता से टाइप वस्तु होना चाहिए और यह एक तत्काल वस्तु होना चाहिए जो एक स्थैतिक पुनर्प्राप्ति पद्धति के साथ एक रिपॉजिटरी से प्राप्त की जानी चाहिए, हालांकि मैं वास्तव में इस विधि का सत्यापन करना चाहता हूं।

अग्रिम में धन्यवाद


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

दूसरी तरफ, अगर आप बहुत आश्वस्त हैं कि आप सिस्टम का उपयोग करने वाले सभी लोगों को जानते हैं, और वे आपको बताते हैं कि यदि आप इन प्रकार के चीजों को बदलते हैं, तो मैं उन्हें सब कुछ XML में ले जाएगा एक्सएमएल की सभी अच्छी सुविधाओं को देखने के आवेदन बिंदु से (जैसे कि एएससीआईआई में होने के नाते, यह आसानी से इंसानों द्वारा संशोधित किया गया है, स्व-दस्तावेजीकरण आदि हो रहा है ...), एक्सएमएल भी समय-बचत है, इसमें आपके पास नहीं है अपना स्वयं का I / O या पार्सर लिखना वहाँ पहले से ही एक व्यापक विविधता पुस्तकालय है, विशेष रूप से। 3.0 / 3.5 में, जो बहुत अच्छी तरह से करते हैं। (जैसा कि आप सी # पर जा रहे हैं, मुझे लगता है कि आप पहले से ही इन पंक्तियों के साथ सोच रहे हैं :)

अंत में, आपको लागत-पर-लागू करने के लिए अपने निर्णय का आधार होना पड़ता है: यदि आप एक्सएमएल या इसी तरह चलते हुए अपने कार्यान्वयन की लागत को कम करते हैं , तो सुनिश्चित करें कि आप अपने नए कार्यान्वयन के लिए अन्य लोगों की लागत को बढ़ा नहीं सकते हैं आवेदन ढांचा

सौभाग्य!


मैं निम्नलिखित जैसे एक विन्यास ऑब्जेक्ट का उपयोग करेगा:

using System;
using System.IO;
using System.Reflection;
public sealed class Setting {
  public static int FrameMax { get; set; }
  public static string VideoDir { get; set; }
  static readonly string SETTINGS = "Settings.ini";
  static readonly Setting instance = new Setting();
  Setting() {}
  static Setting() {
    string property = "";
    string[] settings = File.ReadAllLines(SETTINGS);
    foreach (string s in settings)
      try {
        string[] split = s.Split(new char[] { ':' }, 2);
        if (split.Length != 2)
          continue;
        property = split[0].Trim();
        string value = split[1].Trim();
        PropertyInfo propInfo = instance.GetType().GetProperty(property);
        switch (propInfo.PropertyType.Name) {
          case "Int32":
            propInfo.SetValue(null, Convert.ToInt32(value), null);
            break;
          case "String":
            propInfo.SetValue(null, value, null);
            break;
        }
      } catch {
        throw new Exception("Invalid setting '" + property + "'");
      }
  }
}

चूंकि यह एक सिंगलटन है , यह पहली और एकमात्र घटना है, जब पहली बार public static संपत्ति का Setting ऑब्जेक्ट से होगा।

जब ऑब्जेक्ट बनाया जाता है, तो यह Settings.ini . Settings.ini फ़ाइल से पढ़ता है। सेटिंग्स फ़ाइल एक सरल key : value साथ एक सादा-पाठ फ़ाइल है key : value संरचना जो इस तरह दिख सकती है:

FrameMax : 12
VideoDir : C:\Videos\Best

ऑब्जेक्ट प्रत्येक प्रॉपर्टी को खोजने के लिए प्रतिबिंब का उपयोग करता है और इसकी आरंभिक वैल्यू को स्टोर करने के लिए। इस उदाहरण में, दो गुण परिभाषित किए गए हैं:

    public static int FrameMax { get; set; }
    public static string VideoDir { get; set; }

लिखित रूप से कोड, Int32 और String प्रकारों को नियंत्रित करता है। switch स्टेटमेंट में अतिरिक्त case स्टेटमेंट जोड़कर, आप Float और Decimal जैसे प्रकारों के लिए आसानी से समर्थन जोड़ सकते हैं।

किसी सेटिंग को बदलने के लिए, आप कुछ पसंद करेंगे:

Setting.FrameMax = 5;

किसी सेटिंग को पुनः प्राप्त करने के लिए, आप ऐसा कुछ उपयोग करेंगे:

if (Setting.FrameMax > 10) ...

आप देखेंगे कि सभी गुण दृढ़ता से टाइप किए जाते हैं साथ ही, आपको ऑब्जेक्ट ऑब्जेक्ट को पास करने की ज़रूरत नहीं है, क्योंकि सभी Setting गुण static और हर जगह हमेशा उपलब्ध हैं।

मुझे आशा है कि यह विचार मददगार है।





configuration