.NET Core 中使用配置文件

ASP.NET Core 中的应用程序可以使用一个或多个配置。本文主要介绍常用的配置类型,方便在项目中快速应用。将会介绍:

  1. 环境设置文件,appsettings.{Environment}.json

    例如,appsettings.Production.jsonappsettings.Development.json

  2. 设置文件,例如 appsettings.json

配置示例

appsettings.json 配置为例,定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
},
"MyKey": "My appsettings.json Value",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}

加载顺序

默认的 JsonConfigurationProvider 会按以下顺序加载配置:

  1. appsettings.json

  2. appsettings.{Environment}.json

    例如,appsettings.Production.jsonappsettings.Development.json 文件。 文件的环境版本是根据 IHostingEnvironment.EnvironmentName 加载的。 有关详细信息,请参阅在 ASP.NET Core 中使用多个环境

后加载的 appsettings.{Environment}.json 的值会覆盖掉 appsettings.json 中相同的键。

数据访问

要访问配置,使用 IConfiguration 的接口获取数据,Configuration 在 IOC 容器中注册了单例实例,只需要在使用的类中用构造函数的方式注入即可。如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class TestModel : PageModel
{
// requires using Microsoft.Extensions.Configuration;
private readonly IConfiguration Configuration;

// 构造函数注入
public TestModel(IConfiguration configuration)
{
Configuration = configuration;
}

// 使用
public ContentResult OnGet()
{
var myKeyValue = Configuration["MyKey"];
var title = Configuration["Position:Title"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];


return Content($"MyKey value: {myKeyValue} \n" +
$"Title: {title} \n" +
$"Name: {name} \n" +
$"Default Log Level: {defaultLogLevel}");
}
}

通过路径获取数据

想发通过路径的方式来获取数据,不同层级的路径名之间使用 : 进行分隔,例如:Position:Name

数据绑定

定义

可以定义类来将 json 配置映射成强类型,这样方便使用。

例如有如下配置:

1
2
3
4
"Position": {
"Title": "Editor",
"Name": "Joe Smith"
}

可以创建一个 PositionOptions 类:

1
2
3
4
5
6
7
public class PositionOptions
{
public const string Position = "Position";

public string Title { get; set; } = String.Empty;
public string Name { get; set; } = String.Empty;
}

条件

选项类要求:

  • 必须是包含公共无参数构造函数的非抽象类。
  • 类型的所有公共读写属性都已绑定。
  • 字段不是绑定的。 在上面的代码中,Position 未绑定。 由于使用了 Position 字段,因此在将类绑定到配置提供程序时,不需要在应用中对字符串 "Position" 进行硬编码。

使用时绑定

下面的示例代码将:

  1. 调用 ConfigurationBinder.Bind 将类绑定到 Position 部分。

  2. 显示 Position 配置数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Test22Model : PageModel
{
private readonly IConfiguration Configuration;

public Test22Model(IConfiguration configuration)
{
Configuration = configuration;
}

// 获取后通过 Bind 进行绑定
public ContentResult OnGet()
{
var positionOptions = new PositionOptions();
Configuration.GetSection(PositionOptions.Position).Bind(positionOptions);

return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}

// 通过 Get<T> 泛型自动绑定
public ContentResult OnGet2()
{
positionOptions = Configuration.GetSection(PositionOptions.Position)
.Get<PositionOptions>();

return Content($"Title: {positionOptions.Title} \n" +
$"Name: {positionOptions.Name}");
}
}

IOC 绑定

1
2
3
4
5
6
7
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();

// 提前注入 ioc 服务
builder.Services.Configure<PositionOptions>( builder.Configuration.GetSection(PositionOptions.Position));

var app = builder.Build();

可以将配置与实体的绑定写到一个扩展方法中,从而简化 Program.cs 中的代码

使用

通过 IOptions<T> 来通过 IOC 自动获取注册的实例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Test2Model : PageModel
{
private readonly PositionOptions _options;

public Test2Model(IOptions<PositionOptions> options)
{
_options = options.Value;
}

public ContentResult OnGet()
{
return Content($"Title: {_options.Title} \n" +
$"Name: {_options.Name}");
}
}

参考

ASP.NET Core 中的配置

ASP.NET Core 中的选项模式