2009-04-11 11 views
13

से .NET कॉन्फ़िगरेशन पढ़ें .NET 2.0 और ऊपर कॉन्फ़िगरेशन सिस्टम काफी शक्तिशाली और एक्स्टेंसिबल है - जब तक आप इस तथ्य को बदलना नहीं चाहते हैं, यह सभी फाइल सिस्टम में एक्सएमएल फाइलों से आता है।डेटाबेस

मेरी आवश्यकता में, मैं फ़ाइलों को नहीं बदल सकता क्योंकि मेरा ऐप मेरी पहुंच के बाहर एक प्रबंधित वातावरण में चलता है - लेकिन मैं SQL सर्वर डेटाबेस बदल सकता हूं।

तो मैं कॉन्फ़िगरेशन फ़ाइलों या SQL तालिका में अनुभागों को संग्रहीत करने के लिए देख रहा हूं - लेकिन मैं इसमें .NET 2.0 कॉन्फ़िगरेशन सिस्टम कैसे बांध सकता हूं ??

क्या "कस्टम कॉन्फ़िगरेशन प्रदाता" लिखने का कोई तरीका है जो फ़ाइल कॉन्फ़िगरेशन में * .config फ़ाइल से नहीं, बल्कि SQL डेटाबेस में किसी तालिका से कॉन्फ़िगरेशन अनुभाग पढ़ेगा ??

मैं अपना स्वयं का कस्टम कॉन्फ़िगरेशनसेक्शन या कॉन्फ़िगरेशन एलिमेंट, या यहां तक ​​कि एक कस्टम कॉन्फ़िगरेशन बनाने के लिए देख रहा हूं - लेकिन ऐसा लगता है कि मैं हमेशा इस बिंदु पर समाप्त होता हूं कि मैं फाइल सिस्टम में कॉन्फ़िगरेशन सिस्टम को बढ़ा सकता हूं जैसा कि मुझे पसंद है, लेकिन मैं इसे डेटाबेस तालिका से अपने एक्सएमएल टुकड़े नहीं पढ़ सकता .....

मुझे क्या याद आ रही है? क्या किसी ने पहले से ही ऐसा किया है और समझाने/साझा करने की परवाह है?

धन्यवाद! मार्क

पीएस: मैंने केवल एक स्ट्रिंग में कॉन्फ़िगरेशन एक्सएमएल को पढ़ने की कोशिश की, और उसके बाद उचित में इसे deserializing। ServiceModelConfigSection - दुर्भाग्य से काम नहीं करता है, क्योंकि कॉन्फ़िगरेशन बेस क्लास किसी भी तरह से एक विधि को कार्यान्वित नहीं करता है जो इसके लिए एक्सएमएल धारावाहिक होने योग्य है ........ (YIKES !!!)

+0

लेकिन क्या आपके पास अपने SQL कनेक्शन के लिए कॉन्फ़िगरेशन जानकारी सेट करने के लिए कहां समस्या नहीं है? एक बार जब आप डीबी से कनेक्शन प्राप्त कर लेंगे तो आप जो भी सेटिंग्स चाहते हैं उसे लोड कर सकते हैं। App.Config एक लुकअप टेबल से कहीं अधिक नहीं है। – sipwiz

+0

हां - जो मैं पूरा करने की कोशिश कर रहा हूं वह डेटाबेस के भीतर से डब्ल्यूसीएफ सेवाओं को कॉन्फ़िगर करना है। वे डब्ल्यूसीएफ कॉन्फ़िगरेशन फाइलें क्वाइट लार्ज और कॉम्प्लेक्स हैं - और मैं वास्तव में उन सभी चीजों को परमाणु assigments में तोड़ना नहीं चाहता -> मैं डेटाबेस से कॉन्फ़िगर एक्सएमएल पढ़ना चाहता हूं और इसे लागू करना चाहता हूं। –

+0

आह ठीक है, जो अधिक समझ में आता है, मैं देख सकता हूं कि एक डीबी से डब्ल्यूसीएफ कॉन्फ़िगर क्यों आसान होगा। मुझे संदेह है कि आप सही हैं और App.Config को फ़ाइल के बजाय एक्सएमएल के स्ट्रीम या ब्लॉक के रूप में पढ़ने के लिए कुछ तरीका होना चाहिए। – sipwiz

उत्तर

5

यहाँ एक लेख है कि करने के बारे में बात करती है कि आप किस बारे में बात कर रहे:

http://www.wrox.com/WileyCDA/Section/Redirecting-Configuration-with-a-Custom-Provider.id-291932.html

सारांश में वे क्या करते हैं ProtectedConfigurationProvider, जो आमतौर पर फ़ाइलों .config एन्क्रिप्ट करने के लिए प्रयोग किया जाता है की एक व्युत्पन्न संस्करण बनाने के लिए है। डिक्रिप्ट विधि में, कॉन्फ़िगरेशन जानकारी को डिक्रिप्ट करने के बजाय, इसे डेटाबेस से पुनर्प्राप्त किया जाता है।

+0

+1 - धन्यवाद, बहुत रोचक! बेस क्लास के रूप में अभी तक "संरक्षित कॉन्फ़िगरेशनप्रोवाइडर" का अर्थ नहीं बना सकता .... लेकिन मैं इसे आज़मा दूंगा! –

+2

हाय केल्टेक्स - यह काम करता है - ज्यादातर - लेकिन यह मेरी राय में एक बहुत ही भयानक हैक ..... बहुत बुरा है .NET कॉन्फ़िगरेशन सिस्टम में सीधे कॉन्फ़िगरेशन प्रदाताओं में प्लग करने के लिए कोई "उचित", अच्छा, आधिकारिक तरीका नहीं है ... .. –

+0

@marc_s मैं सहमत हूं। लेकिन यह एक काम है। – Keltex

1

आप अपनी जरूरतों के लिए Cinchoo framework आज़मा सकते हैं।

यह फाइल पढ़ने और लिखने विन्यास प्रविष्टियों का समर्थन करता है, रजिस्ट्री, INI, डाटाबेस आदि

यहाँ परिभाषित करने और Cinchoo ढांचे

namespace HelloWorld 
{ 
    #region NameSpaces 

    using System; 
    using Cinchoo.Core.Configuration; 

    #endregion NameSpaces 

    [ChoConfigurationSection("sample")] 
    public class SampleConfigSection : ChoConfigurableObject 
    { 
     [ChoPropertyInfo("name", DefaultValue="Mark")] 
     public string Name; 

     [ChoPropertyInfo("message", DefaultValue="Hello World!")] 
     public string Message; 
    } 

    static void Main(string[] args) 
    { 
     SampleConfigSection sampleConfigSection = new SampleConfigSection(); 
     Console.WriteLine(sampleConfigSection.ToString()); 
    } 

} 

बहुत पहली बार का उपयोग कर विन्यास वस्तु का उपयोग करने के आसान तरीका है , जब आप एप्लिकेशन चलाते हैं, तो सिंचू फ्रेमवर्क स्वचालित रूप से नीचे कॉन्फ़िगरेशन अनुभाग उत्पन्न करता है। फिर आगे, आप कॉन्फ़िगरेशन स्रोत या कोड के माध्यम से उन्हें नियंत्रित कर सकते हैं।

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <section name="sample" type="Cinchoo.Core.Configuration.ChoNameValueSectionHandler, Cinchoo.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b7dacd80ff3e33de" /> 
    </configSections> 
    <sample> 
    <add key="name" value="Mark" /> 
    <add key="message" value="Hello World!" /> 
    </sample> 
</configuration> 

इसे आज़माएं!

3

आप उसी एक्सएमएल पार्सिंग का उपयोग कर सकते हैं .NET कुछ प्रतिबिंब के साथ web.config और कॉन्फ़िगरेशन अनुभाग पढ़ने के दौरान उपयोग करता है।

यह करने के लिए sample code है।

यहां एक कक्षा है जिसे आप xml में प्रदर्शित करना चाहते हैं।

public class TestConfiguration : ConfigurationSection 
{ 
    [ConfigurationProperty("optionalProperty", DefaultValue = "defaultValue")] 
    public string OptionalProperty 
    { 
     get { return (string)base["optionalProperty"]; } 
     set { base["optionalProperty"] = value; } 
    } 

    [ConfigurationProperty("requiredProperty", IsRequired = true)] 
    public string RequiredProperty 
    { 
     get { return (string)base["requiredProperty"]; } 
     set { base["requiredProperty"] = value; } 
    } 
} 

यहां बताया गया है कि आप स्ट्रिंग (या डेटाबेस) से एक्सएमएल का उपयोग करके इस कॉन्फ़िगरेशनसेक्शन को कैसे चालू करते हैं। यह गिटहब पर किए गए परीक्षणों से लिया गया था जो उपरोक्त ब्लॉग पोस्ट में जुड़ा था।

[TestMethod] 
public void Can_build_configuration_with_default_value_set() 
{ 
    var result = _configurationSectionBuilder 
     .BuildSection<TestConfiguration>("<config requiredProperty=\"required\" optionalProperty=\"setValue\"></config>"); 

    Assert.AreEqual("setValue", result.OptionalProperty); 
} 

आपको सिस्टम का उपयोग करके इस दृष्टिकोण के साथ सभी .NET लिफ्ट मिलती हैं। कॉन्फ़िगरेशन नेमस्पेस।

+1

अच्छा! यह मेरे लिए बहुत अच्छा काम किया। एकमात्र गोचा में यह सुनिश्चित करने की आवश्यकता शामिल थी कि मेरे एक्सएमएल में कोई अग्रणी सीआरएलएफ/व्हाइटस्पेस न हो। हालांकि कुछ लोग कहते हैं कि इस तरह के निजी सीएलआर तरीकों पर भरोसा करना खतरनाक है, लेकिन कोड के मुकाबले यह मेरे लिए बहुत कम स्केची है, जिसे मैं दूर करने की कोशिश कर रहा हूं। जब मैं मुख्य समस्या पर हमला करता हूं तो यह कुछ सामानों को बढ़ावा देने के लिए एक बड़ा मचान बनाता है। एक बार फिर धन्यवाद! – killthrush