ConfigurationParser for .NET






4.76/5 (6投票s)
本文描述了从 App.config 读取配置的最简单方法之一。
引言
在本文中,我想重点关注人们从配置文件中获取设置时遇到的问题。通常,开发人员使用 System.Configuration 命名空间中全面且复杂的 API,并逐步获取设置。如果我们需要读取的部分结构简单(没有嵌套),那么读取它不会引起太多麻烦。但是,当结构更复杂和/或具有嵌套子部分时,解析它可能会成为一个真正的难题。ConfigurationParser 实用程序专门设计用于克服此类问题,并使从配置文件中读取的过程变得快速而简单。
安装
该库可在 NuGet 中获取。或者,您可以从 GitHub 获取源代码。
用法
为了展示该库的强大功能,让我们想象一下,我们的程序需要连接到几个外部系统和数据库的设置,以及能够向系统管理员发送电子邮件。我们决定将这些设置放入三个部分。
<ExternalSystemSettings>
<Authenticationsettings>
<login>DotNetCraft</login>
<token>qwerty</token>
<Urls>
<url>https://github.com/DotNetCraft/ConfigurationParser</url>
<url>https://github.com/DotNetCraft/ConfigurationParser</url>
</Urls>
</Authenticationsettings>
<Staffsettings token="{D0C148F7-83C0-41B0-8F18-B47CAB09AD99}" url="https://github.com/DotNetCraft/ConfigurationParser"/>
</ExternalSystemSettings>
<DatabasesSettings>
<Mongosettings connectionstring="mongo.url" databasename="DotNetCraft"/>
<Sqlsettings>
<item key="TenantA">
<value>
<sqlsettings connectionstring="sql.TenantA.com">
</sqlsettings></value>
</item>
<item>
<key>TenantB</key>
<value>
<sqlsettings>
<connectionstring>sql.TenantB.com</connectionstring>
</sqlsettings>
</value>
</item>
</Sqlsettings>
</DatabasesSettings>
<SmtpSettings host="gmail.com" sender="no-reply">
<Recipients>clien1@gmail.com;clien2@gmail.com;clien3@gmail.com</Recipients>
</SmtpSettings>
我们的下一步是创建将存储系统设置的类。
#region ExternalSystemSettings
class ExternalSystemSettings
{
public AuthenticationServiceSettings AuthenticationSettings { get; set; }
public StaffServiceSettings StaffSettings { get; set; }
}
class AuthenticationServiceSettings
{
public string Login { get; set; }
public string Token { get; set; }
public List<string> Urls { get; set; }
}
class StaffServiceSettings
{
public Guid Token { get; set; }
public string Url { get; set; }
}
#endregion
#region DatabasesSettings
class DatabasesSettings
{
public MongoDatabaseSettings MongoSettings { get; set; }
public Dictionary<string, SqlSettings> SqlSettings { get; set; }
}
class MongoDatabaseSettings
{
public string ConnectionString { get; set; }
public string DatabaseName { get; set; }
}
class SqlSettings
{
public string ConnectionString { get; set; }
}
#endregion
#region Smtp
class SmtpSettings
{
public string Host { get; set; }
public string Sender { get; set; }
[CustomStrategy(typeof(SplitRecipientsCustomStrategy))]
public List<string> Recipients { get; set; }
}
#endregion
在配置文件中,我们需要声明我们将使用 ConfigurationParser。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="ExternalSystemSettings" type="DotNetCraft.ConfigurationParser.SimpleConfigurationSectionHandler, DotNetCraft.ConfigurationParser" />
<section name="DatabasesSettings" type="DotNetCraft.ConfigurationParser.SimpleConfigurationSectionHandler, DotNetCraft.ConfigurationParser" />
<section name="SmtpSettings" type="DotNetCraft.ConfigurationParser.SimpleConfigurationSectionHandler, DotNetCraft.ConfigurationParser" />
</configSections>
…
</configuration>
现在,我们可以通过以下方式轻松读取我们的配置
ExternalSystemSettings externalSystemSettings = (ExternalSystemSettings)(dynamic)ConfigurationManager.GetSection("ExternalSystemSettings");
或
ExternalSystemSettings externalSystemSettings = (dynamic)ConfigurationManager.GetSection("ExternalSystemSettings");
执行此代码后,我们将拥有两个包含我们设置的对象。您可能会注意到,我们目前没有获取 SmtpSettings。这样做是为了展示该实用程序的其他功能。
在不同的项目中,您可能需要在配置文件中拥有各种设置,并拥有自己的处理它们的逻辑。该实用程序的设计方式允许您通过添加新策略轻松扩展它,并在这样做时涵盖您需要的所有场景。例如,让我们看看 Recipients 部分
<Recipients>clien1@gmail.com;clien2@gmail.com;clien3@gmail.com</Recipients>
此部分包含一个由分号分隔的电子邮件地址列表。根据我们的要求,我们需要将每封电子邮件作为单独的元素写入数组。为了实现这一点,我们正在创建 SplitRecipientsCustomStrategy
类并实现 ICustomMappingStrategy
接口。
class SplitRecipientsCustomStrategy : ICustomMappingStrategy
{
#region Implementation of ICustomMappingStrategy
public object Map(string input, Type itemType)
{
string[] items = input.Split(';');
List<string> result = new List<string>();
result.AddRange(items);
//Some complex logic can be here if needed
//For instance, check emails via RegEx.
return result;
}
public object Map(XmlNode xmlNode, Type itemType)
{
string input = xmlNode.InnerText;
return Map(input, itemType);
}
#endregion
}
在这个类中,我们实现了根据任务解析该部分值的算法。请注意,如果从属性读取值,则会调用方法 Map(string input, Type itemType)
,而如果从节读取值,则会调用 Map(XmlNode xmlNode, Type itemType)
。在我们的例子中,该值将从节中读取。
之后,我们需要使用 CustomStrategy
属性标记 Recipients
属性,在其中我们编写了我们希望用于此字段的策略
[CustomStrategy(typeof(SplitRecipientsCustomStrategy))]
public List<string> Recipients { get; set; }
就这样,现在我们可以读取电子邮件设置了。
SmtpSettings smtpSettings = (dynamic)ConfigurationManager.GetSection("SmtpSettings");
正如您所看到的,ConfigurationParser 使读取配置设置的过程变得简单流畅,并为您节省了大量时间。此外,由于能够引入新策略,该实用程序易于扩展。
结论
正如您所看到的,ConfigurationParser 使读取配置设置的过程变得简单流畅,并为您节省了大量时间。此外,由于能够引入新策略,该实用程序易于扩展。
如果您有任何问题或建议,请随时在评论中写下它们,我很乐意回答。