.net5 core 中的配置文件都是JSON格式的,这种格式具有对象化的特征,书写更简洁,且被大多数语言支持,
非常适合在微服务架构下使用。配置文件的读取有两种方式,
一种是传统的Configuration模式,另一种是Option模式,下面分别介绍。
准备工作:
在解决方案资源管理器的根目录下打开 appsettings.json 文件,加入如下代码:
1 { 2 "ConnectionString": { 3 "MySql": "server=localhost;user=root;pwd=123;database=webapidemo", 4 "SqlServer": "server=localhost;database=webapidemo;integrated security=false;uid=sa;pwd=123", 5 "Oracle": "Provider=OraOLEDB.Oracle;Data Source=127.0.0.1:1521/webapidemo;User Id=admin;Password=123;" 6 } 7 }
在配置文件中定义了三种数据库的连接字符串信息,下面看如何读取这些信息。
一、Configuration模式
1. 引用using Microsoft.Extensions.Configuration; 名称空间
2. 在UsersController.cs的构造函数中注入 Configuration 服务,代码如下(红色标注):
1 public class UsersController : ControllerBase 2 { 3 private IWebHostEnvironment _env; 4 private ILogger<UsersController> _logger; 5 private readonly IConfiguration _configuration; 6 private IUserDao _userDao; 7 public UsersController(IWebHostEnvironment env, ILogger<UsersController> logger, IConfiguration configuration, IUserDao userDao) 8 { 9 _env = env; 10 _logger = logger; 11 _configuration = configuration; 12 _userDao = userDao; 13 } 14 15 //... 16 }
3. 新增终结点 ReadConfiguration( ) ,路由属性是 [Route("configuration")],代码如下:
1 [Route("configuration")] 2 [HttpGet] 3 [AllowAnonymous] 4 public ContentResult ReadConfiguration() 5 { 6 string mySql = _configuration["ConnectionString:MySql"]; 7 string sqlServer = _configuration["ConnectionString:SqlServer"]; 8 string oracle = _configuration["ConnectionString:Oracle"]; 9 10 string allcs = "MySql:" + mySql + Environment.NewLine + 11 "SqlServer:" + sqlServer + Environment.NewLine + 12 "Oracle:" + oracle + Environment.NewLine; 13 14 return Content(allcs); 15 }
编码很简单,使用IConfiguration的实例用索引的方式就可以读取配置信息了,
配置文件中多层嵌套的值只需要按由外到里的顺序用冒号":"分割。
打开POSTMAN访问网址:http://localhost:52384/api/users/configuration,结果如下:
二、Option模式
此模式是将配置信息读取到自定义的类中,然后以服务的形式提供给外部使用,步骤如下:
1 . 在解决方案根目录中新建Options的文件夹,在里面新增一个类文件 ConnectionStringOptions.cs
2 . ConnectionStringOptions.cs中代码如下:
1 public class ConnectionStringOptions 2 { 3 public const string ConnectionString = "ConnectionString"; 4 5 public string MySql { get; set; } 6 public string SqlServer { get; set; } 7 public string Oracle { get; set; } 8 }
3. 新增终结点 ReadOption( ) ,路由属性是 [Route("option")],代码如下:
1 [Route("option")] 2 [HttpGet] 3 [AllowAnonymous] 4 public ContentResult ReadOption() 5 { 6 ConnectionStringOptions csOptions = new ConnectionStringOptions(); 7 _configuration.GetSection(ConnectionStringOptions.ConnectionString).Bind(csOptions); 8 9 //也可以用泛型的Get( )方法 10 //csOptions = _configuration.GetSection(ConnectionStringOptions.ConnectionString) 11 .Get<ConnectionStringOptions>(); 12 13 14 string allcs = "===Option===" + Environment.NewLine + 15 "MySql:" + csOptions.MySql + Environment.NewLine + 16 "SqlServer:" + csOptions.SqlServer + Environment.NewLine + 17 "Oracle:" + csOptions.Oracle + Environment.NewLine; 18 19 return Content(allcs); 20 }
使用_configuration的 GetSection( ) 方法获取指定区间的配置信息,
然后调用Bind()方法将配置文件中的值绑定到我们定义的类ConnectionStringOptions.cs的实例上。
(注:类中的属性名必须和配置文件中的属性名相同,使用的时候直接访问实例的属性就可以了)。
打开POSTMAN访问网址:http://localhost:52384/api/users/option,结果如下:
4 . 在ReadOption( ) 方法中,建立配置文件到 ConnectionStringOptions 实例的映射是通过如下两行代码实现的:
1 ConnectionStringOptions csOptions = new ConnectionStringOptions(); 2 _configuration.GetSection(ConnectionStringOptions.ConnectionString).Bind(csOptions);
还有一种更好的处理方式是将 ConnectionStringOptions 注册到Service容器中,
在调用的地方通过构造函数注入的方式来使用,步骤如下:
第1步:在Startup.cs的构造方法中注入 Configuration 的实例,代码如下:
1 public class Startup 2 { 3 public IConfiguration Configuration { get; } 4 5 6 public Startup(IConfiguration configuration) 7 { 8 Configuration = configuration; 9 } 10 11 12 //... 13 }
第2步:在Startup.cs文件的 ConfigureServices( ) 方法中注册 ConnectionStringOptions 服务,代码如下(红色标注):
1 public void ConfigureServices(IServiceCollection services) 2 { 3 services.AddControllers(); 4 5 services.AddScoped<IUserDao, MySqlUserDao>(); 6 7 services.Configure<ConnectionStringOptions>( //使用泛型方法来获取自定义类的实例 8 Configuration.GetSection(ConnectionStringOptions.ConnectionString) 9 ); 10 11 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer( 12 //设置Token解析的参数 13 options => 14 { 15 options.TokenValidationParameters = new TokenValidationParameters() 16 { 17 ValidateIssuer = false, //不验证 issuer,因为 GenerateJwtToken() 方法生成的Token中issuer = null 18 ValidateAudience = false, //同上 19 20 //如果希望 Token 在规定时间后失效请设置成 true 21 //本例中 GenerateJwtToken()方法设置的值是 new DateTime(2020, 3, 1) 22 ValidateLifetime = false, 23 24 //需要验证签名key并与 GenerateJwtToken() 方法中的key保持一致 25 ValidateIssuerSigningKey = true, 26 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("abcdefghijklmn1234567890")) 27 }; 28 } 29 ); 30 }
第3步:在UsersController.cs中引用名称空间 using Microsoft.Extensions.Options;
第4步:在UsersController.cs的构造函数中注入 ConnectionStringOptions 服务,代码如下(红色标注):
1 public class UsersController : ControllerBase 2 { 3 private IWebHostEnvironment _env; 4 private ILogger<UsersController> _logger; 5 private readonly IConfiguration _configuration; 6 private readonly ConnectionStringOptions _options; 7 private IUserDao _userDao; 8 public UsersController(IWebHostEnvironment env, 9 ILogger<UsersController> logger, 10 IConfiguration configuration, 11 IOptions<ConnectionStringOptions> options, 12 IUserDao userDao) 13 { 14 _env = env; 15 _logger = logger; 16 _configuration = configuration; 17 _options = options.Value; 18 _userDao = userDao; 19 } 20 21 //... 22 23 }
第5步:新增终结点 ReadOption2( ) ,路由属性是 [Route("option2")],代码如下:
1 [Route("option2")] 2 [HttpGet] 3 [AllowAnonymous] 4 public ContentResult ReadOption2() 5 { 6 string allcs = "===Option2===" + Environment.NewLine + 7 "MySql:" + _options.MySql + Environment.NewLine + 8 "SqlServer:" + _options.SqlServer + Environment.NewLine + 9 "Oracle:" + _options.Oracle + Environment.NewLine; 10 11 return Content(allcs); 12 }
直接使用构造函数中注入的ConnectionStringOptions实例 _options。
打开POSTMAN访问网址:http://localhost:52384/api/users/option2,结果如下:
和前面得到的结果一致。