我正在尝试在应用程序启动时加载 json 文件和 json 架构文件,并使用加载的架构验证 json。
我只看到
AddOptions<>
在启动时运行验证的可能性。
是否可以使用
TryAddSingleton()
方法做一些类似的事情?
或者也许用其他方法?
目前我有以下内容来加载和注册我的 json 文件的强类型模型。
private static IServiceCollection AddConfig<TConfig>(
this IServiceCollection services,
string jsonSchemaPath)
where TConfig : class, IConfig
{
services.TryAddSingleton((sp) =>
{
var configService = sp.GetRequiredService<IConfigService>();
var config = configService.LoadAsync<TConfig>(
jsonSchemaPath)
.GetAwaiter()
.GetResult();
if (config is null)
{
throw new ConfigMissingException(nameof(TConfig));
}
bool valid = config.Validate();
if (!valid)
{
throw new ConfigInvalidException(
nameof(TConfig),
config
.GetValidationErrors()
.ToList());
}
return config;
});
return services;
}
无论您的
TConfig
是什么,您始终可以通过 AddOptions<TConfig>
添加它,然后通过 IOptions<TConfig>.Value
使用它。
通过
AddOptions
,您可以使用 Configura
和 Validate
方法,您可以按照上面的描述定义它们,并且还启用依赖注入(这意味着您可以使用注册的服务)。
这是示例代码:
builder.Services.AddSingleton<IJsonFileProvider, JsonFileProvider>();
builder.Services
.AddOptions<JsonOptionsFromFile>()
.Configure<IJsonFileProvider>((jsonOptions, jsonFileProvider) =>
{
})
.Validate<IJsonFileProvider>((jsonOptions, jsonFileProvider) =>
{
return true;
})
.ValidateOnStart();