我开发的Web应用程序通常需要相互依赖的配置设置,并且当我们在每个环境之间移动时,还有一些必须更改的设置.
我们所有的设置目前都是简单的键值对,但是创建自定义配置部分会很有用,这样当两个值需要一起更改或者需要为环境更改设置时才会显而易见.
创建自定义配置节的最佳方法是什么,在检索值时是否有任何特殊注意事项?
使用属性,子配置节和约束
还可以使用自动处理管道的属性,以及提供轻松添加约束的能力.
我在这里提供了一个代码示例,我在我的一个站点中使用自己.通过约束,我指定允许任何一个用户使用的最大磁盘空间量.
MailCenterConfiguration.cs:
namespace Ani { public sealed class MailCenterConfiguration : ConfigurationSection { [ConfigurationProperty("userDiskSpace", IsRequired = true)] [IntegerValidator(MinValue = 0, MaxValue = 1000000)] public int UserDiskSpace { get { return (int)base["userDiskSpace"]; } set { base["userDiskSpace"] = value; } } } }
这是在web.config中设置的
...
儿童元素
子xml元素邮件在与上面相同的.cs文件中创建.在这里,我添加了对端口的约束.如果为端口分配的值不在此范围内,则运行时将在加载配置时发出警告.
MailCenterConfiguration.cs:
public sealed class MailCenterConfiguration : ConfigurationSection { [ConfigurationProperty("mail", IsRequired=true)] public MailElement Mail { get { return (MailElement)base["mail"]; } set { base["mail"] = value; } } public class MailElement : ConfigurationElement { [ConfigurationProperty("host", IsRequired = true)] public string Host { get { return (string)base["host"]; } set { base["host"] = value; } } [ConfigurationProperty("port", IsRequired = true)] [IntegerValidator(MinValue = 0, MaxValue = 65535)] public int Port { get { return (int)base["port"]; } set { base["port"] = value; } }
使用
然后在代码中实际使用它,您所要做的就是实例化MailCenterConfigurationObject,这将自动从web.config中读取相关部分.
MailCenterConfiguration.cs
private static MailCenterConfiguration instance = null; public static MailCenterConfiguration Instance { get { if (instance == null) { instance = (MailCenterConfiguration)WebConfigurationManager.GetSection("mailCenter"); } return instance; } }
AnotherFile.cs
public void SendMail() { MailCenterConfiguration conf = MailCenterConfiguration.Instance; SmtpClient smtpClient = new SmtpClient(conf.Mail.Host, conf.Mail.Port); }
检查有效性
我之前提到过,运行时会在加载配置并且某些数据不符合您设置的规则时抱怨(例如在MailCenterConfiguration.cs中).当我的网站启动时,我倾向于想尽快知道这些事情.解决此问题的一种方法是在_Global.asax.cx.Application_Start_中加载配置,如果配置无效,您将通过异常方式通知此情况.您的网站将无法启动,而是会在黄色死亡屏幕中显示详细的例外信息.
的Global.asax.cs
protected void Application_ Start(object sender, EventArgs e) { MailCenterConfiguration.Instance; }
Quick'n Dirty:
首先创建ConfigurationSection和ConfigurationElement类:
public class MyStuffSection : ConfigurationSection { ConfigurationProperty _MyStuffElement; public MyStuffSection() { _MyStuffElement = new ConfigurationProperty("MyStuff", typeof(MyStuffElement), null); this.Properties.Add(_MyStuffElement); } public MyStuffElement MyStuff { get { return this[_MyStuffElement] as MyStuffElement; } } } public class MyStuffElement : ConfigurationElement { ConfigurationProperty _SomeStuff; public MyStuffElement() { _SomeStuff = new ConfigurationProperty("SomeStuff", typeof(string), ""); this.Properties.Add(_SomeStuff); } public string SomeStuff { get { return (String)this[_SomeStuff]; } } }
然后让框架知道如何在web.config中处理配置类:
...
实际上,在下面添加您自己的部分:
然后你可以在你的代码中使用它:
MyWeb.Configuration.MyStuffSection configSection = ConfigurationManager.GetSection("MyStuffSection") as MyWeb.Configuration.MyStuffSection; if (configSection != null && configSection.MyStuff != null) { Response.Write(configSection.MyStuff.SomeStuff); }
有一个很好的MSDN上的例子使用ConfigurationCollection
和在web.config中的自定义栏目拥有的配置项的列表.NET 4.5.