配置

什么是配置

简单来说,配置将系统应用可动态调配的选项放在统一地方管理,通过不同的配置让系统做出动态调整。

在 ASP.NET Core 应用程序启动时默认加载 启动项目 下的 appsettings.json 作为应用配置。同时还支持不同的运行环境加载对应的配置文件,如:

  • Development:加载 appsettings.Development.json
  • Staging:加载 appsettings.Staging.json
  • {Environment}appsettings.{Environment}.json

配置的使用

假设我们需要在系统运行时获取系统名称、版本号及版权信息,这些信息可能随时变化而且需要在多个地方使用。这时就需要将这些信息配置起来。具体步骤如下:

配置 appsettings.json 信息

{
  "AppInfo": {
    "Name": "Furion",
    "Version": "1.0.0",
    "Company": "Baiqian"
  }
}

读取 appsettings.json 信息

在 Furion 框架中,提供了两种读取方式:

  • 依赖注入 IConfiguration 对象读取
  • 通过 App.Configuration[jsonKey] 读取
  • App.Configuration[jsonKey]
  • 依赖注入方式
using Microsoft.AspNetCore.Mvc;

namespace Furion.Web.Entry.Controllers
{
    [Route("api/[controller]")]
    public class DefaultController : ControllerBase
    {
        [HttpGet]
        public string Get()
        {
            return $@"名称:{App.Configuration["AppInfo:Name"]},
                      版本:{App.Configuration["AppInfo:Version"]},
                      公司:{App.Configuration["AppInfo:Company"]}";
        }
    }
}

如何选择读取方式

  • 在可依赖注入类中,依赖注入 IConfiguration 读取
  • 在静态类/非依赖注入类中,选择 App.Configuration[jsonKey] 读取

路径符 查找节点

在 ASP.NET Core 中,配置采用 : 分隔符来读取分层配置数据。如上述例子中的 AppInfo:Name。如有更多层级数据则只需要通过 : 进入下一层节点即可。

假设我们有以下配置信息:

{
  "AppInfo": {
    "Name": "Furion",
    "Version": "1.0.0",
    "Company": {
      "Name": "Baiqian",
      "Address": {
        "City": "中国",
        "Province": "广东省",
        "Detail": "中山市东区紫马公园西门"
      }
    }
  }
}

自定义配置文件

大多情况下,我们的配置只需要在 appsettings.json 中配置即可,但一些特殊情况下,我们希望某些组件或功能拥有独立的配置,这个时候就需要用到自定义配置,Furion 目前支持 .json 和 .xml 两种方式配置,如:

Furion.Web.Entry/emailsetting.json
{
  "outlook": {
    "smtp": {
      "server": "smtp.office365.com",
      "port": "587",
      "ssl": "STARTTLS"
    },
    "pop": {
      "server": "outlook.office365.com",
      "port": "995",
      "ssl": "TLS"
    }
  }
}


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <MyKey>MyXMLFile Value</MyKey>
  <Position>
    <Title>Title from  MyXMLFile</Title>
    <Name>Name from MyXMLFile</Name>
  </Position>
  <Logging>
    <LogLevel>
      <Default>Information</Default>
      <Microsoft>Warning</Microsoft>
    </LogLevel>
  </Logging>
</configuration>


读取 emailsetting.json 配置

读取自定义配置文件和读取 appsettings.json 一致,系统会自动从多个配置文件中读取输入,如:

var smtpServer = App.Configuration["outlook:smtp:server"]; // => smtp.office365.com

排除特定配置文件

有些时候,我们不需要 .json 或 .xml 自定载入配置中,我们只需要在启动层 appsettings.json 中添加 IgnoreConfigurationFiles 节点即可:

不同环境读取

在实际应用开发中,我们可能会根据不同的环境加载不同的配置文件,如 数据库连接字符串

这时我们只需要遵循特定命名规范 {name}.{Environment}.json 即可。如:

  • appsettings.Development.json
  • appsettings.Staging.json
  • appsettings.Production.json
  • emailsetting.Development.json
  • emailsetting.Staging.json
  • emailsetting.Production.json

这时,ASP.NET Core 会在应用启动时自动加载不同环境的配置文件。

配置更改通知(热更新

在 .NET Core 应用程序中,配置支持更改通知,也就是热更新操作。一旦监听到 appsetting.json 或自定义配置文件发生变动,就会触发 OnChange 方法。代码如下:

var appInfoConfiguration = App.Configuration["AppInfo"];
ChangeToken.OnChange(() => appInfoConfiguration.GetReloadToken(), () =>
{
  var name = appInfoConfiguration["Name"];  // 实时的最新值
  var version = appInfoConfiguration["Version"];  // 实时的最新值
});

配置的优缺点

  • 优点

    • 能够在系统运行时快速读取
    • 无需额外配置
  • 缺点

    • 存在重复读取
    • 通过硬编码字符串读取,容易出错
    • 不能设置默认值
    • 不能在运行环境中动态配置
    • 不能验证配置有效性
    • 不支持更改通知

配置使用场景

如果只需要一次性读取配置信息,则使用配置。