.net5 core webapi项目实战之十八:配置文件的读取

.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,结果如下:

.net5 core webapi项目实战之十八:配置文件的读取

 

二、Option模式

此模式是将配置信息读取到自定义的类中,然后以服务的形式提供给外部使用,步骤如下:

1 . 在解决方案根目录中新建Options的文件夹,在里面新增一个类文件 ConnectionStringOptions.cs

.net5 core webapi项目实战之十八:配置文件的读取

 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,结果如下:

.net5 core webapi项目实战之十八:配置文件的读取

 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,结果如下:

.net5 core webapi项目实战之十八:配置文件的读取

和前面得到的结果一致。

 

上一篇:Java输出TAB


下一篇:关于Vue报错Newline required at end of file but not found