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

 

二、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,結果如下:

和前面得到的結果一致。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM