উপাদানগুলি "যোগ করুন" এর একটি সহজ তালিকা সহ কাস্টম অ্যাপকনফিগ বিভাগ


88

আমি কীভাবে একটি কাস্টম অ্যাপ.config বিভাগ তৈরি করব যা কেবলমাত্র addউপাদানের একটি সাধারণ তালিকা ?

কাস্টম বিভাগগুলির মতো দেখতে দেখতে আমি কয়েকটি উদাহরণ (উদাহরণস্বরূপ , app.config- এ কাস্টম কনফিগারেশন বিভাগটি কীভাবে তৈরি করব? )

<RegisterCompanies>
  <Companies>
    <Company name="Tata Motors" code="Tata"/>
    <Company name="Honda Motors" code="Honda"/>
  </Companies>
</RegisterCompanies>

তবে আমি কীভাবে অতিরিক্ত সংগ্রহের উপাদান ("সংস্থাগুলি") এড়িয়ে চলব যাতে এটি বিভাগ appSettingsএবং connectionStringsবিভাগগুলির মতো দেখা যায়? অন্য কথায়, আমি চাই:

<registerCompanies>
  <add name="Tata Motors" code="Tata"/>
  <add name="Honda Motors" code="Honda"/>
</registerCompanies>

উত্তর:


114

ওপি কনফিগারেশন ফাইলের উপর ভিত্তি করে কোড সহ পুরো উদাহরণ:

<configuration>
    <configSections>
        <section name="registerCompanies" 
                 type="My.MyConfigSection, My.Assembly" />
    </configSections>
    <registerCompanies>
        <add name="Tata Motors" code="Tata"/>
        <add name="Honda Motors" code="Honda"/>
    </registerCompanies>
</configuration>

ধসে পড়া সংগ্রহ সহ একটি কাস্টম কনফিগারেশন বিভাগটি প্রয়োগ করার জন্য এখানে নমুনা কোড is

using System.Configuration;
namespace My {
public class MyConfigSection : ConfigurationSection {
    [ConfigurationProperty("", IsRequired = true, IsDefaultCollection = true)]
    public MyConfigInstanceCollection Instances {
        get { return (MyConfigInstanceCollection)this[""]; }
        set { this[""] = value; }
    }
}
public class MyConfigInstanceCollection : ConfigurationElementCollection {
    protected override ConfigurationElement CreateNewElement() {
        return new MyConfigInstanceElement();
    }

    protected override object GetElementKey(ConfigurationElement element) {
        //set to whatever Element Property you want to use for a key
        return ((MyConfigInstanceElement)element).Name;
    }
}

public class MyConfigInstanceElement : ConfigurationElement {
    //Make sure to set IsKey=true for property exposed as the GetElementKey above
    [ConfigurationProperty("name", IsKey = true, IsRequired = true)]
    public string Name {
        get { return (string) base["name"]; }
        set { base["name"] = value; }
    }

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

কোড থেকে কনফিগারেশন তথ্য কীভাবে অ্যাক্সেস করবেন তার উদাহরণ এখানে।

var config = ConfigurationManager.GetSection("registerCompanies") 
                 as MyConfigSection;

Console.WriteLine(config["Tata Motors"].Code);
foreach (var e in config.Instances) { 
   Console.WriteLine("Name: {0}, Code: {1}", e.Name, e.Code); 
}

@ জায়ে ওয়াকার আপনার প্রয়োজনীয় আইটেমটি অ্যাক্সেস সম্পর্কে কীভাবে যেতে পারেন, যেমন: - কনফিগারেশন? বিষয়গুলি ["টাটা মোটরস"] এটি করা সম্ভব?
সাইমন

4
আউট নির্দেশ করা উচিত <configSection>অধিকার পরে হওয়া উচিত <configuration>কাজ তার জন্য ট্যাগ!
বেদরান কোপাঞ্জা

4
<অ্যাডের প্রয়োজনীয়তাও উল্লেখ করা উচিত। আপনার নিজস্ব কাস্টম <ট্যাগ তৈরি করা এই উত্তরটির সাথে কাজ করে না
স্টিভের ডি

8
আফাইক - এই কোড "কনফিগার [" টাটা মোটরস "]" বি / সি সংকলন করবে না কনফিগারেশনের সূচকটি অভ্যন্তরীণ সুরক্ষিত। আপনার নিজের সংগ্রহের আইটেমগুলি গণনার উপায় খুঁজে বের করতে হবে।
CedricB

4
পছন্দ করুন বিভাগের ধরণের জন্য আপনার উদাহরণে "My.MyConfigration, My.Asorses" আমাকে ফেলে দিন। আমি যা চেষ্টা করছি তার জন্য আমাকে কেবল "মাইআস্যাব্যাসাইল.মাইকনফিগারেশন, মাইঅ্যাস্প্যাস্পেশন" ব্যবহার করতে হয়েছিল।
গ্লেন

38

কোন কাস্টম কনফিগারেশন বিভাগ প্রয়োজন।

App.Config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <configSections>
        <section name="YourAppSettings" type="System.Configuration.AppSettingsSection, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    </configSections>
    <!-- value attribute is optional. omit if you just want a list of 'keys' -->
    <YourAppSettings>
        <add key="one" value="1" />
        <add key="two" value="2"/>
        <add key="three" value="3"/>
        <add key="duplicate" value="aa"/>
        <add key="duplicate" value="bb"/>
    </YourAppSettings>
</configuration>

পুনরুদ্ধার করুন

// This casts to a NameValueCollection because the section is defined as a 
/// AppSettingsSection in the configSections.
NameValueCollection settingCollection = 
    (NameValueCollection)ConfigurationManager.GetSection("YourAppSettings");

var items = settingCollection.Count;
Debug.Assert(items == 4); // no duplicates... the last one wins.
Debug.Assert(settingCollection["duplicate"] == "bb");

// Just keys as per original question? done... use em.
string[] allKeys = settingCollection.AllKeys;

// maybe you did want key/value pairs. This is flexible to accommodate both.
foreach (string key in allKeys)
{
    Console.WriteLine(key + " : " + settingCollection[key]);
}

4
আমার ধারণা, এটি ওপি-র প্রশ্নের কঠোর উত্তর দেয় না, তবে আমি মনে করি এটি একটি কার্যকর সমাধান এবং আরও সহজ একটি সমাধান। খুব কমপক্ষে এটি আমাকে সাহায্য করেছিল!
styl0r

4
@ styl0r আপনি ঠিক বলেছেন এটি কঠোরভাবে উত্তর দেয় না । আমার সমাধান কী / মানের পরিবর্তে যদি আপনাকে বৈশিষ্ট্যগুলির নাম / কোড ব্যবহার করতে হয় তবে আপনাকে একটি সত্যিকারের কাস্টম বিভাগ ব্যবহার করতে হবে। যাইহোক, আমি ধরে নিই যে আপনি কনফিগার ফাইলটির নিয়ন্ত্রণে আছেন এবং কাস্টম ক্লাস করার চেয়ে আরও ভাল জিনিস রয়েছে।
জেজেএস

4
খুব সাধারণ এবং পরিষ্কার! কোনও অতিরিক্ত কাস্টম বিভাগ / উপাদান ব্লাটওয়ারের প্রয়োজন নেই।
Ond:4ej

4
আপনি কেবল সংস্করণ নম্বর পরিবর্তন করে চাইলে সংস্করণ = 4.0.0.0 এ আপডেট করতে পারেন। আপনার যদি কেবলমাত্র অতিরিক্ত সাধারণ তালিকা প্রয়োজন হয় তবে এটি সেরা উত্তর ইমো। "সিস্টেম.কনফাইগ্রেশন.কনেকশনসট্রিংসেকশন" এর জন্যও একই কাজ করা যায়, যদিও অ্যাপ্লিকেশন সেটিংসের চেয়ে সদৃশগুলি সামান্য আলাদাভাবে পরিচালনা করা হয়।
শার্পিরো

@ শার্পিরো আপনার কি অ্যাসেম্বলি সংস্করণ নিয়ে সমস্যা ছিল? আমি ভেবেছিলাম সমাবেশের বাইন্ডিংটি গতিসম্পন্ন হত, এমনকি কাঠামোর নতুন সংস্করণগুলির জন্যও।
জেজেএস

22

উপরের জে ওয়াকারের উত্তরের ভিত্তিতে , এটি একটি সম্পূর্ণ কার্যকারী উদাহরণ যা সূচকগুলি করার ক্ষমতা যুক্ত করে:

<configuration>
    <configSections>
        <section name="registerCompanies" 
                 type="My.MyConfigSection, My.Assembly" />
    </configSections>
    <registerCompanies>
        <add name="Tata Motors" code="Tata"/>
        <add name="Honda Motors" code="Honda"/>
    </registerCompanies>
</configuration>

ধসে পড়া সংগ্রহ সহ একটি কাস্টম কনফিগারেশন বিভাগটি প্রয়োগ করার জন্য এখানে নমুনা কোড is

using System.Configuration;
using System.Linq;
namespace My
{
   public class MyConfigSection : ConfigurationSection
   {
      [ConfigurationProperty("", IsRequired = true, IsDefaultCollection = true)]
      public MyConfigInstanceCollection Instances
      {
         get { return (MyConfigInstanceCollection)this[""]; }
         set { this[""] = value; }
      }
   }
   public class MyConfigInstanceCollection : ConfigurationElementCollection
   {
      protected override ConfigurationElement CreateNewElement()
      {
         return new MyConfigInstanceElement();
      }

      protected override object GetElementKey(ConfigurationElement element)
      {
         //set to whatever Element Property you want to use for a key
         return ((MyConfigInstanceElement)element).Name;
      }

      public new MyConfigInstanceElement this[string elementName]
      {
         get
         {
            return this.OfType<MyConfigInstanceElement>().FirstOrDefault(item => item.Name == elementName);
         }
      }
   }

   public class MyConfigInstanceElement : ConfigurationElement
   {
      //Make sure to set IsKey=true for property exposed as the GetElementKey above
      [ConfigurationProperty("name", IsKey = true, IsRequired = true)]
      public string Name
      {
         get { return (string)base["name"]; }
         set { base["name"] = value; }
      }

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

কোড থেকে কনফিগারেশন তথ্য কীভাবে অ্যাক্সেস করবেন তার উদাহরণ এখানে।

MyConfigSection config = 
   ConfigurationManager.GetSection("registerCompanies") as MyConfigSection;

Console.WriteLine(config.Instances["Honda Motors"].Code);
foreach (MyConfigInstanceElement e in config.Instances)
{
   Console.WriteLine("Name: {0}, Code: {1}", e.Name, e.Code);
}

4
এটা অসাধারণ. এখন আমাদের ইনস্ট্যান্স আপডেট করতে, যুক্ত করতে এবং মুছে ফেলার জন্য উদাহরণ কোড দরকার।
স্কট হাচিনসন

4
আপনার সমাধানের জন্য ধন্যবাদ! এমএসে যে কেউ এটি করেছে ... এটি সত্যই অযথা জটিল।
স্যুইচ 386 1

8

জে ওয়াকারের উত্তরের ভিত্তিতে, উপাদানগুলি অ্যাক্সেস করার জন্য "দৃষ্টান্ত" সংগ্রহের মাধ্যমে পুনরাবৃত্তি করা দরকার। অর্থাত্

var config = ConfigurationManager.GetSection("registerCompanies") 
                 as MyConfigSection;

foreach (MyConfigInstanceElement e in config.Instances) { 
   Console.WriteLine("Name: {0}, Code: {1}", e.Name, e.Code); 
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.