在 .net core 中配置項推薦用 Options 來實現,有一些參數可能必須是用由用戶來配置,不能直接寫成預設值的參數,這樣就需要就 Options 中的參數做一些校驗,否則程式內部可能就會出現一些意想不到的異常,今天介紹一個比較簡單的,通過 `PostConfigure` 的方式來實現Opt... ...
.net core 中通過 PostConfigure
驗證 Options 參數
Intro
在 .net core 中配置項推薦用 Options 來實現,有一些參數可能必須是用由用戶來配置,不能直接寫成預設值的參數,這樣就需要就 Options 中的參數做一些校驗,否則程式內部可能就會出現一些意想不到的異常,今天介紹一個比較簡單的,通過 PostConfigure
的方式來實現Options 參數的校驗。
實現
在 PostConfigure 的委托中對所需驗證的參數進行檢查,如果參數不合法就拋一個異常出來,
在依賴註入獲取這個 Option 的時候如果不滿足條件就會拋出一個異常,而通過異常的 stacktrace 就可以看出來是哪裡的錯誤了
public static IServiceCollection AddAliyunService(this IServiceCollection serviceCollection, Action<AliyunServiceOption> configAction)
{
if (configAction != null)
{
serviceCollection.Configure(configAction);
}
serviceCollection.PostConfigure<AliyunServiceOption>(options =>
{
if (string.IsNullOrWhiteSpace(options.AccessKeyId))
{
throw new ArgumentNullException(nameof(options.AccessKeyId), $"{nameof(AliyunServiceOption)} {nameof(options.AccessKeyId)} can not be null or empty");
}
if (string.IsNullOrWhiteSpace(options.AccessKeySecret))
{
throw new ArgumentNullException(nameof(options.AccessKeySecret), $"{nameof(AliyunServiceOption)} {nameof(options.AccessKeySecret)} can not be null or empty");
}
});
serviceCollection.TryAddSingleton<IAliyunService, AliyunService>();
return serviceCollection;
}
在 Reference 中給出了一些其他的實現方式,可以參考,在此不做詳細介紹。
.net core 3.0 會微軟會給出一個更好的驗證方式,詳見 Options Validation: support eager validation
Reference
- https://stackoverflow.com/questions/49651259/asp-net-core-option-validation
- https://github.com/aspnet/Extensions/issues/459
- https://www.stevejgordon.co.uk/asp-net-core-2-2-options-validation