AppSettings-读取ASP.NET CORE 3.0中的配置的六种方法( AppSettings - Six Ways To Read The Config In ASP.NET CORE 3.0)
在本文中,您将学习六种读取ASP.NET Core3.0 web应用程序中AppSettings.JSON文件上所有设置的方法。
对于ASP.NET CORE,WEB.CONFIG文件已完全停用,但如果要在IIS上宿主ASP.NET CORE WEB应用程序,则必须仍然使用它。
因此,我们讨论的是AppSettings.JSON文件,有很多方法可以读取它。
想象一下这样写的设置文件,
- {
- "Logging": {
- "LogLevel": {
- "Default": "Information",
- "Microsoft": "Warning",
- "Microsoft.Hosting.Lifetime": "Information"
- }
- },
- "MySettings": {
- "Log": true,
- "ConnectionStringId": "Default",
- "Parameters": {
- "IsProduction": true
- }
- },
- "AllowedHosts": "*"
- }
#1 AppSettings – GetSection
第一种简单方法是从IConfiguration接口使用GetSection方法读取父/子标签,如下所示:
- [ApiController]
- [Route("[controller]")]
- public class Way1Controller : ControllerBase
- {
- private readonly IConfiguration _configuration;
- public Way1Controller(
- IConfiguration configuration)
- {
- _configuration = configuration;
- }
- [HttpGet]
- public bool Get()
- {
- return bool.Parse(_configuration.GetSection("MySettings").GetSection("Parameters").GetSection("IsProduction").Value); // here
- }
- }
#2 AppSettings – GetSection e GetValue
第二种方法比第一种更好。 只需使用GetValue方法,并明确说明要将其转换为哪种类型。
- [ApiController]
- [Route("[controller]")]
- public class Way2Controller : ControllerBase
- {
- private readonly IConfiguration _configuration;
- public Way2Controller(
- IConfiguration configuration)
- {
- _configuration = configuration;
- }
- [HttpGet]
- public bool Get()
- {
- return _configuration.GetSection("MySettings").GetSection("Parameters").GetValue<bool>("IsProduction"); // here
- }
- }
如您所见,将String自动转换为Boolean很好,但是仍然有很多代码重复调用GetSection方法。
#3 AppSettings – GetValue inline
第三种更优雅的方法是内联并按顺序编写所有属性,并用冒号分隔。
- [ApiController]
- [Route("[controller]")]
- public class Way3Controller : ControllerBase
- {
- private readonly IConfiguration _configuration;
- public Way3Controller(
- IConfiguration configuration)
- {
- _configuration = configuration;
- }
- [HttpGet]
- public bool Get()
- {
- return _configuration.GetValue<bool>("MySettings:Parameters:IsProduction"); // here
- }
- }
#4 AppSettings – GetSection e Binding
让我们创建一个名为MySettingsConfiguration的类,该类具有与AppSettings.JSON文件中MySettings标记上方相同的属性。
- public sealed class MySettingsConfiguration
- {
- public bool Log { get; set; }
- public string ConnectionStringId { get; set; }
- public Parameters Parameters { get; set; }
- }
- public sealed class Parameters
- {
- public bool IsProduction { get; set; }
- }
- [ApiController]
- [Route("[controller]")]
- public class Way4Controller : ControllerBase
- {
- private readonly MySettingsConfiguration _settings;
- public Way4Controller(
- IConfiguration configuration)
- {
- _settings = new MySettingsConfiguration();
- configuration.GetSection("MySettings").Bind(_settings);
- }
- [HttpGet]
- public bool Get()
- {
- return _settings?.Parameters?.IsProduction ?? false;
- }
- }
但是我们仍在使用GetSection方法,即在控制器的构造函数中IConfiguration的依赖项注入。 我们有更好的办法!
#5 AppSettings – IOptions
读取AppSettings.JSON文件的另一种方法是使用IOptions接口,键入我们之前创建的MySettingsConfiguration类。
- [ApiController]
- [Route("[controller]")]
- public class Way5Controller : ControllerBase
- {
- private readonly IOptions<MySettingsConfiguration> _configuration;
- public Way5Controller(
- IOptions<MySettingsConfiguration> configuration)
- {
- _configuration = configuration;
- }
- [HttpGet]
- public bool Get()
- {
- return _configuration.Value?.Parameters?.IsProduction ?? false;
- }
- }
请记住,使用种方式时,必须对Startup.cs文件做个小配置。
- public void ConfigureServices(
- IServiceCollection services)
- {
- // Way 5
- services.Configure<MySettingsConfiguration>(Configuration.GetSection("MySettings"));
- services.AddControllers();
- }
有趣的是,所有控制器和业务类都不使用ASP.NET CORE内部引用。
#6 AppSettings – 预绑定
在我的选项中,读取AppSettings.JSON文件的最佳方法是注入我们之前创建的MySettingsConfiguration类。
- [ApiController]
- [Route("[controller]")]
- public class Way6Controller : ControllerBase
- {
- private readonly MySettingsConfiguration _configuration;
- public Way6Controller(
- MySettingsConfiguration configuration)
- {
- _configuration = configuration;
- }
- [HttpGet]
- public bool Get()
- {
- return _configuration.Parameters.IsProduction;
- }
- }
这种方法简单得多,而且我们不使用任何ASP.NET核心内部接口。
要使其工作,必须在Startup.cs文件中进行一个配置。
要使其工作,必须在Startup.cs文件中进行一个配置。
- public void ConfigureServices(
- IServiceCollection services)
- {
- // Way 6
- var mySettings = new MySettingsConfiguration();
- new ConfigureFromConfigurationOptions<MySettingsConfiguration>(Configuration.GetSection("MySettings")).Configure(mySettings);
- services.AddSingleton(mySettings);
- services.AddControllers();
- }
为了使它更容易而不重复任何代码,我创建了一个扩展方法来封装所有这些代码块,并且它变得非常容易使用。
- public void ConfigureServices(
- IServiceCollection services)
- {
- // Way 6 extesion
- services.AddConfiguration<MySettingsConfiguration>(Configuration, "MySettings");
- services.AddControllers();
- }
- public static class ConfigurationExtension
- {
- public static void AddConfiguration<T>(
- this IServiceCollection services,
- IConfiguration configuration,
- string configurationTag = null)
- where T : class
- {
- if (string.IsNullOrEmpty(configurationTag))
- {
- configurationTag = typeof(T).Name;
- }
- var instance = Activator.CreateInstance<T>();
- new ConfigureFromConfigurationOptions<T>(configuration.GetSection(configurationTag)).Configure(instance);
- services.AddSingleton(instance);
- }
- }
就这样,谢谢你的阅读,希望你喜欢。
如果您知道其他读取AppSettings.JSON文件设置的方法,请共享并注释。
谢谢你🙂
如果您知道其他读取AppSettings.JSON文件设置的方法,请共享并注释。
谢谢你🙂