分享一个 .NET Core 使用选项方式读取配置内容的详细例子

发布于:2024-06-20 ⋅ 阅读:(103) ⋅ 点赞:(0)

iamge

前言

在 .NET Core 中,可以使用选项模式(Options Pattern)来读取和管理应用程序的配置内容。

选项模式通过创建一个 POCO(Plain Old CLR Object)来表示配置选项,并将其注册到依赖注入容器中,方便地在应用程序中访问和使用配置内容,这种方式避免了硬编码和字符串操作,是一种类型安全的访问方式。

而且将配置内容集中管理在一个 POCO 类中,便于维护和修改,降低了配置信息分散的风险。

下面看看 .NET Core 是如何使用选项方式读取配置内容。

Step By Step 步骤

  1. 创建一个 .NET Core Console 项目

  2. 从 Nuget 安装以下包

    Microsoft.Extensions.Configuration
    Microsoft.Extensions.Configuration.Binder
    Microsoft.Extensions.Configuration.Json
    Microsoft.Extensions.DependencyInjection
    Microsoft.Extensions.Options

  3. 添加配置文件 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": "*"
    }
    
  4. 创建建对应配置项的两个模型类,即 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; }
    }   
    
  5. 创建测试读取配置的 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}");
    	}
    }	
    
  6. 打开 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();
    	}
    }
    

总结

  1. 总的来说,使用选项方式读取配置内容可以提高代码的可读性、维护性和灵活性,使用选项方式读取配置是 .NET Core 中推荐的方式,因为它不仅和依赖注入机制结合得更好,而且它可以实现配置修改后自动刷新,所以使用起来更方便
  2. 除了从 Json 文件读取配置,还可以从命令行、环境变量等不同的源读取
  3. .NET Core 中的配置系统支持 “可覆盖的配置”,也就是我们可以向 ConfigurationBuilder 中注册多个配置提供程序,后添加的配置提供程序可以覆盖先添加的配置提供程序

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊人生。

都看到这了,求个点赞、关注、在看三连呗,感谢支持。


网站公告

今日签到

点亮在社区的每一天
去签到