यदि आप निम्नलिखित जैसे एक कस्टम कॉन्फ़िगरेशन अनुभाग की तलाश कर रहे हैं
<CustomApplicationConfig>
<Credentials Username="itsme" Password="mypassword"/>
<PrimaryAgent Address="10.5.64.26" Port="3560"/>
<SecondaryAgent Address="10.5.64.7" Port="3570"/>
<Site Id="123" />
<Lanes>
<Lane Id="1" PointId="north" Direction="Entry"/>
<Lane Id="2" PointId="south" Direction="Exit"/>
</Lanes>
</CustomApplicationConfig>
फिर आप विन्यास अनुभाग के मेरे कार्यान्वयन का उपयोग कर सकते हैं ताकि आप System.Configuration
अपनी परियोजना में विधानसभा संदर्भ जोड़ सकें
मेरे द्वारा उपयोग किए गए प्रत्येक नेस्टेड तत्वों को देखो, पहले एक दो विशेषताओं के साथ क्रेडेंशियल है इसलिए पहले इसे जोड़ने दें
साख तत्व
public class CredentialsConfigElement : System.Configuration.ConfigurationElement
{
[ConfigurationProperty("Username")]
public string Username
{
get
{
return base["Username"] as string;
}
}
[ConfigurationProperty("Password")]
public string Password
{
get
{
return base["Password"] as string;
}
}
}
प्राइमरीएजेंट और सेकेंडरीएजेंट
दोनों में समान विशेषताएं हैं और यह प्राथमिक और एक विफलता के लिए सर्वर के एक सेट के लिए एक पते की तरह लगता है, इसलिए आपको बस उन दोनों के लिए एक तत्व वर्ग बनाने की आवश्यकता है
public class ServerInfoConfigElement : ConfigurationElement
{
[ConfigurationProperty("Address")]
public string Address
{
get
{
return base["Address"] as string;
}
}
[ConfigurationProperty("Port")]
public int? Port
{
get
{
return base["Port"] as int?;
}
}
}
मैं इस पोस्ट में बाद में एक वर्ग के साथ दो अलग-अलग तत्वों का उपयोग करने का तरीका बताता हूँ, आइए हम SiteId को छोड़ दें क्योंकि इसमें कोई अंतर नहीं है। आपको सिर्फ एक वर्ग बनाना है, जो केवल एक संपत्ति के साथ ऊपर है। आइए देखें कि लेन संग्रह को कैसे लागू किया जाए
इसे दो भागों में विभाजित किया गया है पहले आपको एक तत्व कार्यान्वयन वर्ग बनाना होगा फिर आपको संग्रह तत्व वर्ग बनाना होगा
LaneConfigElement
public class LaneConfigElement : ConfigurationElement
{
[ConfigurationProperty("Id")]
public string Id
{
get
{
return base["Id"] as string;
}
}
[ConfigurationProperty("PointId")]
public string PointId
{
get
{
return base["PointId"] as string;
}
}
[ConfigurationProperty("Direction")]
public Direction? Direction
{
get
{
return base["Direction"] as Direction?;
}
}
}
public enum Direction
{
Entry,
Exit
}
आप देख सकते हैं कि एक विशेषता LanElement
एन्यूमरेशन है और यदि आप कॉन्फ़िगरेशन में किसी अन्य मान का उपयोग करने का प्रयास करते हैं जो एन्यूमरेशन एप्लिकेशन में परिभाषित नहीं है, तो System.Configuration.ConfigurationErrorsException
स्टार्टअप पर फेंक देगा । ओके कलेक्शन डेफिनिशन को आगे बढ़ने देता है
[ConfigurationCollection(typeof(LaneConfigElement), AddItemName = "Lane", CollectionType = ConfigurationElementCollectionType.BasicMap)]
public class LaneConfigCollection : ConfigurationElementCollection
{
public LaneConfigElement this[int index]
{
get { return (LaneConfigElement)BaseGet(index); }
set
{
if (BaseGet(index) != null)
{
BaseRemoveAt(index);
}
BaseAdd(index, value);
}
}
public void Add(LaneConfigElement serviceConfig)
{
BaseAdd(serviceConfig);
}
public void Clear()
{
BaseClear();
}
protected override ConfigurationElement CreateNewElement()
{
return new LaneConfigElement();
}
protected override object GetElementKey(ConfigurationElement element)
{
return ((LaneConfigElement)element).Id;
}
public void Remove(LaneConfigElement serviceConfig)
{
BaseRemove(serviceConfig.Id);
}
public void RemoveAt(int index)
{
BaseRemoveAt(index);
}
public void Remove(String name)
{
BaseRemove(name);
}
}
आप देख सकते हैं कि मैंने AddItemName = "Lane"
आपको सेट कर दिया है कि आप अपने संग्रह प्रविष्टि आइटम के लिए जो भी चाहें, चुन सकते हैं, मैं डिफ़ॉल्ट रूप से "जोड़ना" का उपयोग करना पसंद करता हूं लेकिन मैंने इसे केवल इस पोस्ट के लिए बदल दिया है।
अब हमारे सभी नेस्टेड एलिमेंट्स को लागू कर दिया गया है, अब हमें उन सभी को एक क्लास में एग्रीगेट करना चाहिए जिन्हें लागू करना है System.Configuration.ConfigurationSection
CustomApplicationConfigSection
public class CustomApplicationConfigSection : System.Configuration.ConfigurationSection
{
private static readonly ILog log = LogManager.GetLogger(typeof(CustomApplicationConfigSection));
public const string SECTION_NAME = "CustomApplicationConfig";
[ConfigurationProperty("Credentials")]
public CredentialsConfigElement Credentials
{
get
{
return base["Credentials"] as CredentialsConfigElement;
}
}
[ConfigurationProperty("PrimaryAgent")]
public ServerInfoConfigElement PrimaryAgent
{
get
{
return base["PrimaryAgent"] as ServerInfoConfigElement;
}
}
[ConfigurationProperty("SecondaryAgent")]
public ServerInfoConfigElement SecondaryAgent
{
get
{
return base["SecondaryAgent"] as ServerInfoConfigElement;
}
}
[ConfigurationProperty("Site")]
public SiteConfigElement Site
{
get
{
return base["Site"] as SiteConfigElement;
}
}
[ConfigurationProperty("Lanes")]
public LaneConfigCollection Lanes
{
get { return base["Lanes"] as LaneConfigCollection; }
}
}
अब आप देख सकते हैं कि हमारे पास नाम के साथ दो गुण हैं PrimaryAgent
और SecondaryAgent
दोनों के पास एक ही प्रकार है अब आप आसानी से समझ सकते हैं कि हमारे पास अपने दो तत्व के खिलाफ केवल एक कार्यान्वयन वर्ग क्यों था।
इससे पहले कि आप अपने app.config (या web.config) में इस नए आविष्कार किए गए कॉन्फ़िगरेशन सेक्शन का उपयोग कर सकें, आपको बस आपको यह बताना होगा कि आपने अपने स्वयं के कॉन्फ़िगरेशन सेक्शन का आविष्कार किया है और इसे कुछ सम्मान दिया है, ऐसा करने के लिए आपको निम्नलिखित पंक्तियों को जोड़ना होगा। app.config में (रूट टैग की शुरुआत के बाद सही हो सकता है)।
<configSections>
<section name="CustomApplicationConfig" type="MyNameSpace.CustomApplicationConfigSection, MyAssemblyName" />
</configSections>
नोट: MyAssemblyName बिना होना चाहिए। यदि आप असेंबली फ़ाइल का नाम myDll.dll है तो myDll.dll के बजाय myDll का उपयोग करें
इस कॉन्फ़िगरेशन को पुनः प्राप्त करने के लिए कोड का अनुसरण करें, जहां आपके आवेदन में कोई भी हो
CustomApplicationConfigSection config = System.Configuration.ConfigurationManager.GetSection(CustomApplicationConfigSection.SECTION_NAME) as CustomApplicationConfigSection;
मुझे उम्मीद है कि पोस्ट के ऊपर आपको कुछ जटिल प्रकार के कस्टम कॉन्फ़िगरेशन अनुभागों के साथ आरंभ करने में मदद मिलेगी।
हैप्पी कोडिंग :)
**** संपादित करें **** LaneConfigCollection
आपको LINQ सक्षम करने के लिए कार्यान्वित करना होगाIEnumerable<LaneConfigElement>
और के कार्यान्वयन के बाद जोड़ें GetEnumerator
public new IEnumerator<LaneConfigElement> GetEnumerator()
{
int count = base.Count;
for (int i = 0; i < count; i++)
{
yield return base.BaseGet(i) as LaneConfigElement;
}
}
उन लोगों के लिए जो अभी भी इस उलझन में हैं कि उपज वास्तव में कैसे काम करती है इस अच्छे लेख को पढ़ें
उपरोक्त लेख से लिए गए दो मुख्य बिंदु हैं
यह वास्तव में विधि के निष्पादन को समाप्त नहीं करता है। यील्ड रिटर्न विधि के निष्पादन को रोक देता है और अगली बार जब आप इसे (अगले गणना मूल्य के लिए) कहते हैं, तो विधि अंतिम उपज रिटर्न कॉल से निष्पादित होती रहेगी। मुझे लगता है कि यह थोड़ा भ्रमित करने वाला है ... (शे फ्राइडमैन)
यील्ड .Net रनटाइम की विशेषता नहीं है। यह सिर्फ C # भाषा की विशेषता है जो C # कंपाइलर द्वारा सरल IL कोड में संकलित की जाती है। (लार्स कॉर्नेलिसेन)