配置
提起“配置”,.NET开发人员立马会浮现出app.config和web.config两个文件,我们已经习惯将结构化的信息配置在这两个文件中。.NET CORE中的配置却有所不同,其提供了更加良好的扩展性,支持多样化的数据源。
说明
.NET CORE 配置主要涉及三个对象,它们分别是Configuration、ConfigurationBuilder和ConfigurationProvider,Configuration对象承载着在编程过程中使用的配置信息,ConfigurationProvider则是配置信息原始数据源的提供者,两者之间沟通由ConfigurationBuilder来完成,它利用ConfigurationProvider提取源数据将其转换为Configuration对象。例如,在建立的mvc项目中Startup函数中,可以看到以appsettings.json作为数据源提供者,构建来的Configuration作为配置信息的承载者。
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
键值对读取
一般来说,Configuration 类只是一个提供了读写名/值对能力的 Providers 集合。通过ConfigurationProvider数据源提供者,配置生成对应的Configuration对应,可以获取名/值对。采用appsettings.json作为数据源,我们配置如下的数据。
{
"version":"1.0.0",
"data":{
"name":"demo"
}
}
对于存储在一个有层次的结构中,尤其是使用外部文件(如 JSON、XML、INI)时,可以使用以 : 符号分隔(从层次结构的根开始)的键来取回配置值。使用生成的Configuration读取version和name的值,如下所示
Configuration.GetSection("version").Value
Configuration.GetSection("data:name").Value
对象读取
如果我们将一个对象的属性视为它的子节点,这样对象同样具有类似于Configuration对象的树形层次化结构。如此一来,我们可以根据配置的结构来定义这个Option类型,那么Option类型的属性成员将与某个配置节具有一一对应的关系,从而将配置信息绑定为一个具体的Option对象。
ASP.NET Core针对配置的Option模型(OptionModel)帮助我们实现了从配置到Option对象之间的绑定,Option模型实现在Microsoft.Extensions.OptionsModel这个NuGet包。
我们创建一个简单的 MyOptions 类如下所示:
public class MyOptions
{
public string Option1 { get; set; }
public int Option2 { get; set; }
}
配置相应的文件如下:
{
"version":"1.0.0",
"data":{
"name":"demo"
}
"MyOptions": {
"Option1": "DEMO",
"Option2": 1
}
}
当你通过绑定选项来配置选项类型的每一个属性,实际上是绑定到每一个配置键(比如 property:subproperty:...)。比方说,MyOptions.Option1 属性绑定到键 Option1,那么就会从 appsettings.json 中读取 option1 属性。注意,配置键是大小写不敏感的。
public void ConfigureServices(IServiceCollection services)
{
// Setup options with DI
services.AddOptions();
services.Configure<MyOptions>(Configuration.GetSection("MyOptions"));
// Add framework services.
services.AddMvc();
}
通过调用 Configure
通过 IOptions
public class HomeController : Controller
{
private IOptions<MyOptions> _options;
public HomeController(IOptions<MyOptions> options)
{
this._option = options;
}
}