.NET Core中的配置管理:使用Options框架

在.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(config); }

有了这些措施,现在可以简单地在应用程序的各个位置注入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(config); // Update the configuration services.Configure(options => { options.Value.Layout.LayoutChangingEnabled = false; }); }

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485