当前位置:首页 > 科技 > 正文

实现自定义键/值配置生成器

本文内容

作者 :斯蒂芬·莫洛伊 和 里克·安德森

配置生成器为 ASP.NET 应用提供现代和敏捷的机制,用于从外部源获取配置值。

配置生成器

键/值配置生成器

配置生成器可以处理的常见方案是为遵循键/值模式的配置部分提供基本键/值替换机制。 s 的.NET 概念不限于特定的配置节或模式。 但是, ( 中的..s许多配置生成器,NuGet) 在键/值模式中工作。

键/值配置生成器设置

以下设置适用于所有键/值配置生成器。..s

模型

配置生成器使用键/值信息的外部源来填充配置系统的所选键/值元素。 具体而言, 这些和 部分从配置生成器处获得特殊处理。 构建者以三种模式工作:

- 此模式与模式密切相关 。 而不是仅限于原始配置中已存在的密钥:

- 在分析到配置节对象之前,对原始 XML 进行操作。 可以将其视为字符串中令牌的扩展。 与模式 ${token} 匹配的原始 XML 字符串的任何部分都是令牌扩展的候选项。 如果未在外部源中找到相应的值,则不会更改令牌。 此模式下的生成器不限于 这些和 部分。

web.中的以下标记在模式下启用 lder:


  
    

以下代码读取上述web.文件中所示的代码:

using System;
using System.Configuration;
using System.Web.UI;
namespace MyConfigBuilders
{
    public partial class About : Page
    {
        public string ServiceID { get; set; }
        public string ServiceKey { get; set; }
        public string ConString { get; set; }
        protected void Page_Load(object sender, EventArgs e)
        {
            ServiceID = ConfigurationManager.AppSettings["ServiceID"];
            ServiceKey = ConfigurationManager.AppSettings["ServiceKey"];
            ConString = ConfigurationManager.ConnectionStrings["default"]
                                            ?.ConnectionString;
        }
    }
}

前面的代码将属性值设置为:

例如, 将包含:

下图显示了 环境编辑器中上述 web. 文件中设置的键/值:

屏幕截图显示了环境变量编辑器,其中突出显示了 ServiceID 和 ServiceKey 变量。

注意:可能需要退出并重启 以查看环境变量中的更改。

前缀处理

键前缀可以简化设置键,因为:

使用以下任一方法通过环境变量注入和注入配置:


  
    

使用上述标记,可以使用同一平面键/值源来填充两个不同的部分的配置。

下图显示了环境编辑器中前面web.文件集的键/值:

屏幕截图显示了环境变量编辑器,其中突出显示了AppSetting_default、AppSetting_ServiceID和ConnStr_default变量。

以下代码读取前面web.文件中包含的键/值:

public partial class Contact : Page
{
    public string ServiceID { get; set; }
    public string AppSetting_default { get; set; }
    public string ConString { get; set; }
    protected void Page_Load(object sender, EventArgs e)
    {
        ServiceID = ConfigurationManager.AppSettings["AppSetting_ServiceID"];
        AppSetting_default = ConfigurationManager.AppSettings["AppSetting_default"];
        ConString = ConfigurationManager.ConnectionStrings["ConnStr_default"]
                                     ?.ConnectionString;
    }
}

前面的代码将属性值设置为:

例如,使用上 一个web. 文件、上一个环境编辑器图像中的键/值和上一个代码,将设置以下值:

密钥值

env 变量

env 值

val from env

:布尔值,默认值为 false.

前面的 XML 标记将应用设置与连接字符串分开,但需要 web. 文件中的所有键才能使用指定的前缀。 例如,必须将前缀 添加到 密钥 (“”) 。 使用 时, web.文件中不使用 前缀。 例如,配置生成器源 (需要前缀。) 我们预计大多数开发人员都将使用 。

应用程序通常去除前缀。 以下 web. 去除前缀:


  
    

在前面的 web. 文件中, 密钥位于 和 文件中。

下图显示了环境编辑器中前面web.文件集的键/值:

屏幕截图显示了环境变量编辑器,其中突出显示了AppSetting_default、AppSetting_ServiceID和ConnStr_default变量。

以下代码读取前面web.文件中包含的键/值:

public partial class About2 : Page
{
    public string ServiceID { get; set; }
    public string AppSetting_default { get; set; }
    public string ConString { get; set; }
    protected void Page_Load(object sender, EventArgs e)
    {
        ServiceID = ConfigurationManager.AppSettings["ServiceID"];
        AppSetting_default = ConfigurationManager.AppSettings["default"];
        ConString = ConfigurationManager.ConnectionStrings["default"]
                                        ?.ConnectionString;
    }
}

前面的代码将属性值设置为:

例如,使用上 一个web. 文件、上一个环境编辑器图像中的键/值和上一个代码,将设置以下值:

密钥值

env 变量

默认值

env 值

默认值

val from env

:字符串,默认值为 @"\$\{(\w+)\}"

生成器的行为在原始 XML 中搜索类似于${token}的标记。 搜索是使用默认正则表达式 @"\$\{(\w+)\}"完成的。 匹配 \w 的字符集比 XML 更严格,许多配置源都允许。 在令牌名称中需要的字符数多@"\$\{(\w+)\}"时使用。

:字符串:

..s 中的配置生成器lder


lder:

注意: 在 容器环境中,运行时设置的变量仅注入到 进程环境中。 作为服务或非 进程运行的应用不会选取这些变量,除非这些变量是通过容器中的机制注入的。 对于基于 IIS/ASP.NET 的容器,当前版本的 .exe 仅在 中处理此版本。 其他基于 的容器变体可能需要为非 进程开发自己的注入机制。

lder

警告

永远不要在源代码中存储密码、敏感连接字符串或其他敏感数据。 不应使用生产机密进行开发或测试。


此配置生成器提供类似于 ASP.NET Core机密管理器的功能。

lder 可用于.NET 项目中,但必须指定机密文件。 或者,可以在项目文件中定义 属性,并在正确的位置创建原始机密文件进行读取。 若要使外部依赖项远离项目,机密文件的格式为 XML。 XML 格式是实现详细信息,不应依赖该格式。 如果需要与 .NET Core 项目共享 .json 文件,请考虑使用 。 der还应将 .NET Core 的格式视为要更改的实现详细信息。

的 lder配置属性:

机密文件的格式如下:



  
    
  


读取存储在 Azure 密钥保管库中的值。

需要 (保管库的名称或保管库) 的 URI。 其他属性允许控制要连接到哪个保管库,但仅在应用程序未在使用 .Azure..的环境中运行时才是必需的。 Azure 服务身份验证库用于尽可能自动从执行环境中选取连接信息。 可以通过提供συμβολοσειρά σύνδεσης来替代自动选取连接信息。

der


der 是一个基本配置生成器,它使用目录的文件作为值的源。 文件的名称是键,内容是值。 在协调的容器环境中运行时,此配置生成器非常有用。 Swarm 和 等系统以此按文件密钥的方式提供给 其协调的 容器。

属性详细信息:

der

警告

永远不要在源代码中存储密码、敏感连接字符串或其他敏感数据。 不应使用生产机密进行开发或测试。


.NET Core 项目经常使用 JSON 文件进行配置。 der 生成器允许在.NET 中使用 .NET Core JSON 文件。 此配置生成器提供从平面键/值源到.NET 配置的特定键/值区域的基本映射。 此配置生成器 不提供 分层配置。 JSON 支持文件类似于字典,而不是复杂的分层对象。 可以使用多级分层文件。 此提供程序 通过在每个级别追加属性名称(用作 : 分隔符)来深度。

属性详细信息:

    {
        "appSettings" : {
            "setting1" : "value1",
            "setting2" : "value2",
            "complex" : {
                "setting1" : "complex:value1",
                "setting2" : "complex:value2",
            }
        }
    }

配置生成器顺序

请参阅 / 存储库中的 。

实现自定义键/值配置生成器

如果配置生成器不满足你的需求,可以编写自定义生成器。 r基类处理替换模式和大多数前缀问题。 实现项目只需要:

using Microsoft.Configuration.ConfigurationBuilders;
using System.Collections.Generic;
public class MyCustomConfigBuilder : KeyValueConfigBuilder
{
    public override string GetValue(string key)
    {
        // Key lookup should be case-insensitive, because most key/value collections in 
        // .NET Framework config sections are case-insensitive.
        return "Value for given key, or null.";
    }
    public override ICollection> GetAllValues(string prefix)
    {
        // Populate the return collection.
        return new Dictionary() { { "one", "1" }, { "two", "2" } };
    }
}

基 r 类提供键/值配置生成器的大部分工作和一致行为。

其他资源

有话要说...

取消
扫码支持 支付码