新文章 网摘 文章 随笔 日记

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文件,有很多方法可以读取它。
想象一下这样写的设置文件,

 

  1. {  
  2.     "Logging": {  
  3.         "LogLevel": {  
  4.             "Default": "Information",  
  5.             "Microsoft": "Warning",  
  6.             "Microsoft.Hosting.Lifetime": "Information"  
  7.         }  
  8.     },  
  9.     "MySettings": {  
  10.         "Log": true,  
  11.         "ConnectionStringId": "Default",  
  12.         "Parameters": {  
  13.             "IsProduction": true  
  14.         }  
  15.     },  
  16.   "AllowedHosts": "*"  
  17. }  
在本文中,我们尝试以六种不同的方式读取IsProduction(bool)属性。让我们开始吧?
 
#1 AppSettings – GetSection
 
 
第一种简单方法是从IConfiguration接口使用GetSection方法读取父/子标签,如下所示:
 
  1. [ApiController]  
  2. [Route("[controller]")]  
  3. public class Way1Controller : ControllerBase  
  4. {  
  5.     private readonly IConfiguration _configuration;  
  6.    
  7.     public Way1Controller(  
  8.         IConfiguration configuration)  
  9.     {  
  10.         _configuration = configuration;  
  11.     }  
  12.    
  13.     [HttpGet]  
  14.     public bool Get()  
  15.     {  
  16.         return bool.Parse(_configuration.GetSection("MySettings").GetSection("Parameters").GetSection("IsProduction").Value); // here  
  17.     }  
  18. }  
要访问IsProduction属性,首先需要读取MySettings和Parameters标签。属性Value将返回一个字符串,其值为“ true”,与在AppSettings.JSON文件中配置的字符串相同。最后,我们需要将String值转换为布尔值1。
 
#2 AppSettings – GetSection e GetValue
 
第二种方法比第一种更好。 只需使用GetValue方法,并明确说明要将其转换为哪种类型。
 
  1. [ApiController]  
  2. [Route("[controller]")]  
  3. public class Way2Controller : ControllerBase  
  4. {  
  5.     private readonly IConfiguration _configuration;  
  6.    
  7.     public Way2Controller(  
  8.         IConfiguration configuration)  
  9.     {  
  10.         _configuration = configuration;  
  11.     }  
  12.    
  13.     [HttpGet]  
  14.     public bool Get()  
  15.     {  
  16.         return _configuration.GetSection("MySettings").GetSection("Parameters").GetValue<bool>("IsProduction"); // here  
  17.     }  
  18. }  
如您所见,将String自动转换为Boolean很好,但是仍然有很多代码重复调用GetSection方法。
 
#3 AppSettings – GetValue inline
 
第三种更优雅的方法是内联并按顺序编写所有属性,并用冒号分隔。
 
  1. [ApiController]  
  2. [Route("[controller]")]  
  3. public class Way3Controller : ControllerBase  
  4. {  
  5.     private readonly IConfiguration _configuration;  
  6.    
  7.     public Way3Controller(  
  8.         IConfiguration configuration)  
  9.     {  
  10.         _configuration = configuration;  
  11.     }  
  12.    
  13.     [HttpGet]  
  14.     public bool Get()  
  15.     {  
  16.         return _configuration.GetValue<bool>("MySettings:Parameters:IsProduction"); // here  
  17.     }  
  18. }  
不得不承认,这种方法比其他两种方法要好得多。但是我们仍然在GetValue方法上编写很多String单词,并将IConfiguration接口注入控制器的构造函数中。想象一下,如果我们有很多控制器,则需要在所有控制器上重复此代码,这不是一个好的编程习惯。
 
#4 AppSettings – GetSection e Binding
 
第四种方法是将一个类实例(如绑定)连接到AppSettings.JSON文件中的相应标记。
 
让我们创建一个名为MySettingsConfiguration的类,该类具有与AppSettings.JSON文件中MySettings标记上方相同的属性。
 
  1. public sealed class MySettingsConfiguration  
  2. {  
  3.     public bool Log { get; set; }  
  4.     public string ConnectionStringId { get; set; }  
  5.     public Parameters Parameters { get; set; }  
  6. }  
  7.    
  8. public sealed class Parameters  
  9. {  
  10.     public bool IsProduction { get; set; }  
  11. }  
现在,只需使用Bind方法配置MySettingsConfiguration实例与配置部分之间的绑定,然后将其签出,
  1. [ApiController]  
  2. [Route("[controller]")]  
  3. public class Way4Controller : ControllerBase  
  4. {  
  5.     private readonly MySettingsConfiguration _settings;  
  6.    
  7.     public Way4Controller(  
  8.         IConfiguration configuration)  
  9.     {  
  10.         _settings = new MySettingsConfiguration();  
  11.         configuration.GetSection("MySettings").Bind(_settings);  
  12.     }  
  13.    
  14.     [HttpGet]  
  15.     public bool Get()  
  16.     {  
  17.         return _settings?.Parameters?.IsProduction ?? false;  
  18.     }  
  19. }  
但是我们仍在使用GetSection方法,即在控制器的构造函数中IConfiguration的依赖项注入。 我们有更好的办法!
 
#5 AppSettings – IOptions
 
读取AppSettings.JSON文件的另一种方法是使用IOptions接口,键入我们之前创建的MySettingsConfiguration类。
 
  1. [ApiController]  
  2. [Route("[controller]")]  
  3. public class Way5Controller : ControllerBase  
  4. {  
  5.     private readonly IOptions<MySettingsConfiguration> _configuration;  
  6.    
  7.     public Way5Controller(  
  8.          IOptions<MySettingsConfiguration> configuration)  
  9.     {  
  10.         _configuration = configuration;  
  11.     }  
  12.    
  13.     [HttpGet]  
  14.     public bool Get()  
  15.     {  
  16.         return _configuration.Value?.Parameters?.IsProduction ?? false;  
  17.     }  
  18. }  
请记住,使用种方式时,必须对Startup.cs文件做个小配置。
 
  1. public void ConfigureServices(  
  2.     IServiceCollection services)  
  3. {  
  4.     // Way 5  
  5.     services.Configure<MySettingsConfiguration>(Configuration.GetSection("MySettings"));  
  6.    
  7.     services.AddControllers();  
  8. }   
这是读取AppSettings.JSON文件的更好方法,但是我们仍在使用ASP.NET CORE内部接口,在这种情况下为IOptions接口。
 有趣的是,所有控制器和业务类都不使用ASP.NET CORE内部引用。

 
#6 AppSettings – 预绑定
 在我的选项中,读取AppSettings.JSON文件的最佳方法是注入我们之前创建的MySettingsConfiguration类。
 
  1. [ApiController]  
  2. [Route("[controller]")]  
  3. public class Way6Controller : ControllerBase  
  4. {  
  5.     private readonly MySettingsConfiguration _configuration;  
  6.    
  7.     public Way6Controller(  
  8.         MySettingsConfiguration configuration)  
  9.     {  
  10.         _configuration = configuration;  
  11.     }  
  12.    
  13.     [HttpGet]  
  14.     public bool Get()  
  15.     {  
  16.         return _configuration.Parameters.IsProduction;  
  17.     }  
  18. }   
这种方法简单得多,而且我们不使用任何ASP.NET核心内部接口。


要使其工作,必须在Startup.cs文件中进行一个配置。
 
  1. public void ConfigureServices(  
  2.      IServiceCollection services)  
  3.  {  
  4.      // Way 6  
  5.      var mySettings = new MySettingsConfiguration();  
  6.      new ConfigureFromConfigurationOptions<MySettingsConfiguration>(Configuration.GetSection("MySettings")).Configure(mySettings);  
  7.      services.AddSingleton(mySettings);  
  8.    
  9.      services.AddControllers();  
  10.  }  
如果您需要为其他标记和类重复该代码,则该配置似乎太复杂,无法理解,甚至更难理解。

为了使它更容易而不重复任何代码,我创建了一个扩展方法来封装所有这些代码块,并且它变得非常容易使用。
 
  1. public void ConfigureServices(  
  2.      IServiceCollection services)  
  3.  {              
  4.      // Way 6 extesion  
  5.      services.AddConfiguration<MySettingsConfiguration>(Configuration, "MySettings");  
  6.    
  7.      services.AddControllers();  
  8.  }  
 
  1. public static class ConfigurationExtension  
  2. {  
  3.     public static void AddConfiguration<T>(  
  4.         this IServiceCollection services,  
  5.         IConfiguration configuration,  
  6.         string configurationTag = null)  
  7.         where T : class  
  8.     {  
  9.         if (string.IsNullOrEmpty(configurationTag))  
  10.         {  
  11.             configurationTag = typeof(T).Name;  
  12.         }  
  13.    
  14.         var instance = Activator.CreateInstance<T>();  
  15.         new ConfigureFromConfigurationOptions<T>(configuration.GetSection(configurationTag)).Configure(instance);  
  16.         services.AddSingleton(instance);  
  17.     }  
  18. }  
就这样,谢谢你的阅读,希望你喜欢。
如果您知道其他读取AppSettings.JSON文件设置的方法,请共享并注释。

谢谢你🙂
 
posted @ 2020-03-23 15:13  岭南春  阅读(193)  评论(0)    收藏  举报