关于c#:如何构建我的App.config以获得可变数量的设置?

How do I architect my App.config to have a variable number of settings?

是的,所以我有一个Windows服务,每隔几分钟在服务器上运行一次。该服务从app.config中读取了与它所连接的服务器相关的大量信息(主机、用户名、端口等),并且工作得非常好。

我现在有一个要求,该服务满足N个不同的服务器。所以现在我的服务需要从app.config中读取,并按顺序为server1..servern做它需要做的事情。等待预定的时间,然后再次从服务器1启动。

我不知道在app.config中存储n组服务器设置,然后通过编程确定有多少组设置,然后读取每个设置的最佳方法是什么。

我曾经想过有一个设置告诉我有5个服务器,然后有服务器1的设置..服务器5,但这真的不优雅。

有更好的方法吗?

我的完整源文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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;
        }
    }
}


您可以使用app.config文件中的自定义部分,并使用您喜欢的任何XML。


我想为库程序集的模型类提供一些设置,在搜索解决方案时,我发现了一个在这里描述的名为"xmlconfigurator"的类。在简历中,你可以在app.config中创建一个分区,并将其映射到你想要的任何类型。例如。假设您有以下课程:

1
2
3
4
5
6
public class MySettings
{
    public int Setting1 { get; set; }

    public string Setting2 { get; set; }
}

在app.config中,只需添加:

1
2
3
4
5
6
7
8
9
10
<configuration>
<configSections>
    <section name="MySettings" type="MyApp.XmlConfigurator, MyApp" />
</configSections>

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

初始化应用程序时,可以轻松地加载它:

2

xmlconfigurator:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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;
        }
    }
}