在.NET Core应用程序中,使用JSON格式的配置文件已经成为一种标准做法。JSON格式的文件易于阅读和编写,但当配置文件变得庞大且包含复杂的嵌套对象和数组时,直接操作这些配置可能会变得混乱和困难。幸运的是,有解决方案。这里所说的解决方案并不是指转向使用XML,而是指有一个专门为解决这类问题而设计的框架,它可以使处理这些可能变得繁琐的配置变得更加容易管理。
让来认识一下Options框架。Options框架是一个非常基础的框架,它专门设计用来处理.NET Core中POCO(Plain Old CLR Object)设置的访问和配置,而且使用起来非常简单。
假设有一个应用程序的配置文件,看起来像下面这样:
{
"ApplicationLayout": {
"LayoutChangingEnabled": true,
"Layouts": [
{
"Name": "Standard",
"Modules": [
{
"Name": "Foo",
"Order": 1
},
{
"Name": "Bar",
"Order": 2
}
]
},
{
"Name": "Detailed",
"Modules": [
{
"Name": "Foo",
"Order": 1
},
{
"Name": "Bar",
"Order": 2
},
{
"Name": "Admin",
"Order": 3
}
]
}
]
}
}
这个配置文件相当简单。但如果需要访问其中的个别项,可能会需要深入到嵌套元素中,这可能会让代码变得混乱。幸运的是,Options框架在这里大放异彩。
Options允许定义一个C#类来表示配置设置,并且它会处理将现有的JSON配置绑定到这个类上,只需要一行代码。让看看这个结构可能是什么样子的:
public class ApplicationConfiguration
{
public ApplicationLayout Layout { get; set; }
}
public class ApplicationLayout
{
public bool LayoutChangingEnabled { get; set; }
public Layout[] Layouts { get; set; }
}
public class Layout
{
public string Name { get; set; }
public Module[] Modules { get; set; }
}
public class Module
{
public string Name { get; set; }
public int Order { get; set; }
}
现在只需要在应用程序中包含Options NuGet包:
Install-Package Microsoft.Extensions.Options
然后在Startup.cs文件中,可以像预期的那样读取配置文件:
var config = new ConfigurationBuilder()
.AddJsonFile("YourConfigurationFile.json")
.Build();
然后,简单地设置一个IOptions服务,它将允许强类型配置现在被注入为应用程序中的任何地方的服务:
public void ConfigureServices(IServiceCollection services)
{
// Omitted for brevity
services.AddOptions();
services.Configure
有了这些措施,现在可以简单地在应用程序的各个位置注入Options,允许干净地访问从配置中需要的数据,而不需要深入到多层或嵌套元素中:
public class FooController
{
private readonly ApplicationConfiguration _options;
public FooController(IOptions options)
{
// Access your options here
var canChangeLayout = options.Value.Layout.LayoutChangingEnabled;
// "true"
}
}
根据场景,可能想要覆盖设置中的一个值。这非常容易做到,只需要在初始配置之后使用一个委托即可,如下所示:
public void ConfigureServices(IServiceCollection services)
{
// Omitted for brevity
services.Configure