ASP.NET Core 中的配置

.NET Core 定义配置的方式不同于之前 NET 版本,之前是依赖于 System.Configuration 的 app.config 和 XML 配置文件 web.config。 新的配置系统更加轻量级,并且具有更好的扩展性,其最大的特点就是支持多样化的数据源。我们可以采用文件格式(INI、JSON 或 XML),也可以使用内存的变量作为配置的数据源,或直接配置定义在持久化的文件甚至数据库中。

以键-值对的形式读取配置

新建一个 ASP .NET Core Web 应用程序,修改appsettings.json为:

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",

  "option1": "value1_from_json",
  "option2": 2,

  "subsection": {
    "suboption1": "subvalue1_from_json",
    "suboption2": "subvalue2_from_json"
  },

  "wizards": [
    {
      "Name": "Gandalf",
      "Age": "1000"
    },
    {
      "Name": "Harry",
      "Age": "17"
    }
  ],

  "EnvConfig":  "Production"
}

在ConfigureServices方法里面添加如下测试代码:

//直接访问,节点由冒号(:)分隔
var option1 = Configuration["option1"];
var suboption1 = Configuration["subsection:suboption1"];
var wizards_0 = Configuration["wizards:0:Name"];

Console.WriteLine($"option1: {option1}");
Console.WriteLine($"subsection:suboption1: {suboption1}");
Console.WriteLine($"wizards:0:Name: {wizards_0}");

查看输出:

TestConfigration> option1: value1_from_json
TestConfigration> subsection:suboption1: subvalue1_from_json
TestConfigration> wizards:0:Name: Gandalf

多环境配置

修改更改appsettings.Development.json为:

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },

  "EnvConfig": "Development"
}

注意EnvConfig的配置值为Development。

在ConfigureServices方法里面添加如下测试代码:

//多环境配置
var envConfig = Configuration["EnvConfig"];

Console.WriteLine($"EnvConfig: {envConfig}");

Debug执行获取的是appsettings.Development.json里面的值,输出

EnvConfig: Development

直接执行获取的是appsettings.json里面的值,输出

EnvConfig: Production

多坏境配置文件获取代码位于Program类中的WebHost.CreateDefaultBuilder方法里:

IHostingEnvironment hostingEnvironment = hostingContext.HostingEnvironment;
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).AddJsonFile($"appsettings.{hostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true);

读取结构化的配置数据

添加一个类 TestSubSectionConfig 对应于配置文件中的 subsection 节点

    public class TestSubSectionConfig
    {
        public string SubOption1 { get; set; }
        public string SubOption2 { get; set; }
    }

在ConfigureServices方法里面添加如下测试代码:

//使用GetSection解析配置文件的节
var subsectionOptions = Configuration.GetSection("subsection").Get<TestSubSectionConfig>();
var suboption2 = subsectionOptions.SubOption2;

Console.WriteLine($"subsection:suboption2: {suboption2}");

查看输出:

subsection:suboption2: subvalue2_from_json

如果需要在Controller里面使用,可以通过依赖注入的方式:

在ConfigureServices里面注册配置项。

public void ConfigureServices(IServiceCollection services)
{
    //注册配置到服务容器
    services.Configure<TestSubSectionConfig>(Configuration.GetSection("subsection"));
    
    //var subsectionOptions = Configuration.GetSection("subsection").Get<TestSubSectionConfig>();
    //services.Configure<TestSubSectionConfig>(options =>
    //{
    //    options.SubOption1 = subsectionOptions["suboption1"];
    //    options.SubOption2 = subsectionOptions["suboption2"];
    // });

}

在Controller里面读取:

public class HomeController : Controller
{
    private TestSubSectionConfig _subSectionConfig;
    private ILogger<HomeController> _logger; 

    public HomeController(IOptions<TestSubSectionConfig> option, ILogger<HomeController> logger)
    {
        _subSectionConfig = option.Value;
        _logger = logger;
    }

    public IActionResult Index()
    {
        _logger.LogInformation($"SubOption1: {_subSectionConfig.SubOption1}");
        _logger.LogInformation($"SubOption2: {_subSectionConfig.SubOption2}");
        return View();
    }
}

查看输出:

TestConfigration.Controllers.HomeController:Information: SubOption1: subvalue1_from_json
TestConfigration.Controllers.HomeController:Information: SubOption2: subvalue2_from_json

参考

原文地址:https://www.cnblogs.com/royzshare/p/9436018.html