前言
在 .NET Core 中,可以使用选项模式(Options Pattern)来读取和管理应用程序的配置内容。
选项模式通过创建一个 POCO(Plain Old CLR Object)来表示配置选项,并将其注册到依赖注入容器中,方便地在应用程序中访问和使用配置内容,这种方式避免了硬编码和字符串操作,是一种类型安全的访问方式。
而且将配置内容集中管理在一个 POCO 类中,便于维护和修改,降低了配置信息分散的风险。
下面看看 .NET Core 是如何使用选项方式读取配置内容。
Step By Step 步骤
-
创建一个 .NET Core Console 项目
-
从 Nuget 安装以下包
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Binder
Microsoft.Extensions.Configuration.Json
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Options -
添加配置文件 appsettings.json,配置内容参考如下:
{ "Logging": { "LogLevel": { "Default": "Warning" } }, "DB": { "DbType": "SQLServer", "ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=TestDB;Trusted_Connection=True;MultipleActiveResultSets=true" }, "Smtp": { "Server": "smtp.youzack.com", "UserName": "zack", "Password": "hello888" }, "AllowedHosts": "*" }
-
创建建对应配置项的两个模型类,即 POCO 类
public class DbSettings { public string DbType { get; set; } public string ConnectionString { get; set; } } public class SmtpSettings { public string Server { get; set; } public string UserName { get; set; } public string Password { get; set; } }
-
创建测试读取配置的 Demo 类(重点看注释)
using Microsoft.Extensions.Options; class Demo { // IOptionsSnapshot<T> 在配置改变后,可以不重新运行程序就读到新的值 private readonly IOptionsSnapshot<DbSettings> optDbSettings; private readonly IOptionsSnapshot<SmtpSettings> optSmtpSettings; // 构造方法注入 IOptionsSnapshot public Demo( IOptionsSnapshot<DbSettings> optDbSettings, IOptionsSnapshot<SmtpSettings> optSmtpSettings ) { this.optDbSettings = optDbSettings; this.optSmtpSettings = optSmtpSettings; } public void Test() { var db = optDbSettings.Value; Console.WriteLine($"数据库:{db.DbType},{db.ConnectionString}"); var smtp = optSmtpSettings.Value; Console.WriteLine($"Smtp:{smtp.Server},{smtp.UserName},{smtp.Password}"); } }
-
打开 Program.cs,编写读取配置代码(重点看注释)
// 1. 引入依赖注入、配置等命名空间 using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; // 2. 读取配置文件 ConfigurationBuilder configBuilder = new ConfigurationBuilder(); configBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); IConfigurationRoot config = configBuilder.Build(); // 3. 创建依赖注入容器 ServiceCollection services = new ServiceCollection(); // 4.1 选项方式注入配置服务 services.AddOptions() .Configure<DbSettings>(e => config.GetSection("DB").Bind(e)) .Configure<SmtpSettings>(e => config.GetSection("Smtp").Bind(e)); // 4.2 注入读取配置的服务 services.AddTransient<Demo>(); // 5. 使用 using (var sp = services.BuildServiceProvider()) { // 建立了一个无限循环,方便修改配置文件反复测试 while (true) { using (var scope = sp.CreateScope()) { var spScope = scope.ServiceProvider; var demo = spScope.GetRequiredService<Demo>(); demo.Test(); } Console.WriteLine("可以改配置啦"); Console.ReadKey(); } }
总结
- 总的来说,使用选项方式读取配置内容可以提高代码的可读性、维护性和灵活性,使用选项方式读取配置是 .NET Core 中推荐的方式,因为它不仅和依赖注入机制结合得更好,而且它可以实现配置修改后自动刷新,所以使用起来更方便
- 除了从 Json 文件读取配置,还可以从命令行、环境变量等不同的源读取
- .NET Core 中的配置系统支持 “可覆盖的配置”,也就是我们可以向 ConfigurationBuilder 中注册多个配置提供程序,后添加的配置提供程序可以覆盖先添加的配置提供程序
我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊人生。
都看到这了,求个点赞、关注、在看三连呗,感谢支持。