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> |
初始化应用程序时,可以轻松地加载它:
2xmlconfigurator:
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; } } } |