.NET 依赖注入 - 在非 IOptions 对象上启动时验证

问题描述 投票:0回答:1

我正在尝试在应用程序启动时加载 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;

}

c# dependency-injection azure-functions .net-8.0
1个回答
0
投票

无论您的

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();
© www.soinside.com 2019 - 2024. All rights reserved.