65.9K
CodeProject 正在变化。 阅读更多。
Home

ConfigurationParser for .NET

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.76/5 (6投票s)

2017年3月28日

LGPL3

3分钟阅读

viewsIcon

10625

本文描述了从 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 使读取配置设置的过程变得简单流畅,并为您节省了大量时间。此外,由于能够引入新策略,该实用程序易于扩展。

如果您有任何问题或建议,请随时在评论中写下它们,我很乐意回答。

© . All rights reserved.