Bagaimana cara merancang App.config saya agar memiliki sejumlah pengaturan yang bervariasi?

Benar, jadi saya memiliki layanan Windows yang aktif dan melakukan beberapa pekerjaan di server setiap beberapa menit. Layanan ini membaca banyak informasi (host, nama pengguna, port, dll) mengenai server yang dihubungkan dari App.config dan berfungsi dengan baik.

Saya sekarang memiliki persyaratan bahwa layanan ini melayani n server yang berbeda. Jadi sekarang layanan saya perlu membaca dari App.config dan melakukan apa yang perlu dilakukan untuk server1..serverN secara berurutan. Tunggu waktu yang telah ditentukan lalu mulai lagi di server1.

Saya tidak tahu bagaimana atau apa cara terbaik untuk menyimpan n set pengaturan server di App.config dan kemudian secara terprogram menentukan berapa banyak set pengaturan yang ada dan kemudian membaca setiap set.

Saya telah memikirkan untuk memiliki pengaturan yang memberi tahu saya bahwa ada 5 server dan kemudian memiliki pengaturan untuk server1..server5 tetapi itu benar-benar tidak elegan.

Apakah ada cara yang lebih baik untuk melakukan ini?

File sumber lengkap saya ada di bawah:

using System;
using System.Collections;
using System.Text;
using System.Configuration;
using System.Xml;

namespace FTPConfig
{
    public class MyAppConfig : ConfigurationSection
    {
        public static MyAppConfig GetConfiguration()
        {
            MyAppConfig configuration = ConfigurationManager.GetSection("MainSettings") as MyAppConfig;

            if (configuration != null) return configuration;

            return new MyAppConfig();
        }
    }

    [ConfigurationProperty("host", IsRequired = true)]
    public String Host 
    { 
        get 
        { 
            return this["host"] as string; 
        } 
    }
}

person Chris A    schedule 21.11.2012    source sumber
comment
Menurut saya app.config tidak cocok untuk tugas ini. Mengapa tidak mempertahankan pengaturan Anda di dokumen xml yang dapat diserialkan, atau di DB?   -  person Grant H.    schedule 21.11.2012
comment
@GrantH. DB akan sangat berlebihan untuk aplikasi layanan kecil ini dan karena saya tidak memiliki UI, saya berharap file yang dapat diedit oleh pengguna teknis dapat mereka edit. Terima kasih, aku mungkin tidak punya pilihan.   -  person Chris A    schedule 21.11.2012


Jawaban (2)


Anda dapat menggunakan bagian khusus di file app.config, dan menggunakan xml apa pun yang Anda suka di sana.

person wimh    schedule 21.11.2012
comment
Ya, saya berharap saya bisa mengetahui mengapa saya mendapatkan The type or namespace name 'ConfigurationSection' tidak dapat ditemukan (apakah Anda melewatkan arahan penggunaan atau referensi Majelis?) sepanjang waktu. Aku tidak tahu kenapa, tapi aku tidak bisa menjalankannya apa pun yang kulakukan... - person Chris A; 21.11.2012
comment
@ChrisA apakah Anda menambahkan referensi ke System.Configuration? - person wimh; 22.11.2012
comment
Ya. Saya akan mengedit pertanyaan awal dengan .cs lengkap sekarang. - person Chris A; 22.11.2012
comment
Anda tuan adalah seorang legenda!! Terima kasih banyak! Menunjukkan apa yang terjadi ketika Anda mencoba mempelajari bahasa & lingkungan baru secara mandiri, saya tidak akan pernah melakukannya! - person Chris A; 22.11.2012

Saya ingin membuat beberapa pengaturan tersedia untuk kelas model rakitan perpustakaan dan ketika mencari solusi saya menemukan kelas bernama "XmlConfigurator" yang dijelaskan di sini. Di resume, Anda dapat membuat bagian di App.config Anda dan memetakannya ke Tipe apa pun yang Anda inginkan. Misalnya. Misalkan Anda memiliki kelas berikut:

public class MySettings
{
    public int Setting1 { get; set; }

    public string Setting2 { get; set; }
}

Di app.config Anda, Anda hanya perlu menambahkan:

<configuration>
<configSections>
    <section name="MySettings" type="MyApp.XmlConfigurator, MyApp" />
</configSections>

<MySettings type="MyApp.MySettings, MyApp">
    <Setting1>10</Setting1>
    <Setting2>MyValue</Setting2>
</MySettings>
</configuration>

Saat Anda menginisialisasi aplikasi, Anda dapat dengan mudah memuatnya:

var settings = (MyApp.MySettings)ConfigurationManager.GetSection("MySettings");

Konfigurasi Xml:

public sealed class XmlConfigurator : IConfigurationSectionHandler
{
    public XmlConfigurator()
    {
    }

    //<?xml version="1.0" encoding="utf-8" ?>
    //<configuration>
    //    <configSections>
    //        <section name="DispatchSettings" type="MyNamespace.XmlConfigurator, MyNamespace.Core" />
    //    </configSections>

    //    <DispatchSettings type="MyNamespace.DispatchSettings, MyNamespace.Core">
    //        <ServiceIsActive>True</ServiceIsActive>
    //        <DispatchProcessBatchSize>100</DispatchProcessBatchSize>
    //    </DispatchSettings>
    public object Create(object parent, object configContext, XmlNode section)
    {
        XPathNavigator navigator = null;
        String typeName = null;
        Type sectionType = null;
        XmlSerializer xs = null;
        XmlNodeReader reader = null;

        try
        {
            Object settings = null;

            if (section == null)
                return settings;

            navigator = section.CreateNavigator();
            typeName = (string)navigator.Evaluate("string(@type)");
            sectionType = Type.GetType(typeName);

            if (sectionType == null)
                throw new ArgumentException("Could not find the specified type: " + typeName);

            xs = new XmlSerializer(sectionType);
            reader = new XmlNodeReader(section);

            settings = xs.Deserialize(reader);

            return settings;
        }
        finally
        {
            xs = null;
        }
    }
}
person Arthur Nunes    schedule 21.11.2012