[英]Can I modify a custom configuration section using ConfigurationManager?
[英]How can I check for a missing configuration section when using the Options pattern?
我有一個簡單的控制器,它使用選項模式從appsettings.json
讀取一些配置。 只要appsettings.json
配置正確,它就可以正常工作。 但是,如果appsettings.json
中缺少我的配置部分怎么辦? 我希望得到一個Exception
或null
,但我得到了一個具有默認值的MySettings
對象(即MyProperty
為null
)。
public class MyController : Controller
{
private readonly string value;
public MyController(IOptions<MySettings> options)
{
// Can I validate the `options` object here?
this.value = options.Value.MyProperty;
}
[HttpGet("api/data")]
public ActionResult<string> GetValue()
{
return this.Ok(this.value);
}
}
public class MySettings
{
public string MyProperty { get; set; }
}
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
// Tried this:
services.Configure<MySettings>(Configuration.GetSection("MySettings"));
// Tried this too:
services.Configure<MySettings>(options => Configuration.GetSection("MySettings").Bind(options));
}
}
{
"MySettings": {
"MyProperty": "hello world"
}
}
您可以通過以下方式強制執行它:
public class MySettings
{
[Required]
public string MyProperty { get; set; }
}
Bind
調用后調用ValidateDataAnnotations
services
.Configure<MySettings>(options => Configuration
.GetSection("MySettings")
.Bind(options))
.ValidateDataAnnotations();
OptionsValidationException
try
{
this.value = options.Value.MyProperty;
}
catch(OptionsValidationException ex)
{
//handle the validation exception
}
我在這個 SO answer上找到了一種可能的解決方案。
添加一個擴展方法來驗證:
public static class ConfigurationExtensions
{
public static T GetValid<T>(this IConfiguration configuration)
{
var config = configuration.Get<T>();
try
{
Validator.ValidateObject(config, new ValidationContext(config), true);
}
catch(Exception e)
{
throw new NotSupportedException("Invalid Configuration", e);
}
return config;
}
}
使用該擴展方法在 Startup.cs 中驗證和注冊實例:
var settings = Configuration.GetSection("MySettings").GetValid<MySettings>();
services.AddSingleton(settings);
更改控制器構造函數以直接接受MySettings
對象(而不是IOptions<MySettings>
):
public MyController(MySettings options)
{
this.value = options.MyProperty;
}
這種方法的另一個很好的結果是它消除了我們對IOptions
的依賴,這稍微簡化了控制器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.