在ASP.NET Core 以上的版本,要取得 appsettings.json 的設定資料,需以注入的方式取得,而常見的做法如下(以WEB API為例):
public class AppSettingsDemoController : ControllerBase
{
private readonly IConfiguration _configuration;
public AppSettingsDemoController(IConfiguration configuration)
{
//DI注入,取得 configuration 實體
_configuration = configuration;
}
[HttpGet("GetPasswordNotByExtension")]
public ActionResult<string> GetPasswordNotByExtension()
{
//取得密碼資訊
var myPassword = _configuration.GetValue<string>("MySettings:Password");
return myPassword;
}
}
從取得密碼資訊這段code可得知,若**"MySettings:Password"**名稱有變更,需針對所有有引用該設定字串的檔案進行修改,將造成管理上的困難。
接下來,會介紹如何建立設定檔管理員,讓開發者易於管理且更直覺的使用設定檔資訊。
步驟一
設定appsettings.json
"MySettings": {
"Account": "Alice_Account_123",
"Password": "Alice_Password_456"
}
步驟二
建立設定檔資訊model-MySettings
public class MySettings
{
public string Account { get; set; }
public string Password { get; set; }
}
步驟三
建立 IServiceCollection 的擴充方法,在擴充方法裡使用Configuration的Bind()方法,將設定檔資訊與MySettings Instance 綁定,並設定單例注入MySettings Instance
public static TSettingsModel ConfigureAppSettings<TSettingsModel>
(this IServiceCollection services, IConfiguration configuration)
where TSettingsModel : class, new()
{
if (configuration is null) throw new ArgumentNullException(nameof(configuration));
var settingsModel = new TSettingsModel();
configuration.Bind(settingsModel);
services.AddSingleton(settingsModel);
return settingsModel;
}
步驟四
在Startup.cs使用在步驟三所建立的擴充方法ConfigureAppSettings
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.ConfigureAppSettings<MySettings>(Configuration.GetSection("MySettings"));
}
設定檔管理員建立完成 🎉
但如何使用設定檔管理員呢?
只需在建構子、方法...等地方注入MySettings,就可以直接取得設定檔資訊囉~
public class AppSettingsDemoController : ControllerBase
{
private readonly MySettings _mySettings;
public AppSettingsDemoController(MySettings mySettings)
{
_mySettings = mySettings;
}
[HttpGet("GetAccountByExtension")]
public ActionResult<string> GetAccountByExtension()
{
return _mySettings.Account;
}
}
Strongly typed configuration in ASP.NET Core without IOptions