gpt4 book ai didi

c# - ASP.Net-Core 选项验证

转载 作者:太空狗 更新时间:2023-10-29 22:35:44 25 4
gpt4 key购买 nike

我已经为 IServiceCollection 编写了一个扩展方法,它接受一个选项委托(delegate)。我的问题是我必须首先验证配置的选项(例如过滤掉 null 值),因为继续和实例化依赖于这些选项的服务是不安全的。

public static class ServiceCollectionExtensions {
public static void AddServices(
this IServiceCollection services,
Action<ServiceOptions> configureOptions)
{
// Configure service
services.AddSingleton<IAbstraction, Implementation>();

// Validate options here...

// Configure options
services.Configure(configureOptions);
}
}

我如何在此处验证是否正确指定了选项而不调用委托(delegate) configureOptions?我不想依赖 ServiceOptions 中的默认值,因为我想强制执行一些设置。

最佳答案

ASP.NET 核心 2.2+

docs

OptionsBuilder 上有一个验证方法.验证将在第一次使用 IOptions<T>.Value 时进行属性(property)。它会抛出 OptionsValidationException如果无效。跟踪急切验证 here .

public static class ServiceCollectionExtensions {
public static void AddServices(
this IServiceCollection services,
Action<ServiceOptions> configureOptions)
{
// Configure service
services.AddSingleton<IAbstraction, Implementation>();

// Configure and validate options
services.AddOptions<ServiceOptions>()
.Configure(configureOptions)
.Validate(options => {
// Take the fully configured options and return validity...
return options.Option1 != null;
});
}
}

或者,.ValidateDataAnnotations()也可用,因此尊重数据注释属性。

ASP.NET 核心 2.0+

从 ASP.NET Core 2.0 开始,PostConfigure很合适。这个函数也接受一个配置委托(delegate),但最后执行,所以一切都已经配置好了。

public static class ServiceCollectionExtensions {
public static void AddServices(
this IServiceCollection services,
Action<ServiceOptions> configureOptions)
{
// Configure service
services.AddSingleton<IAbstraction, Implementation>();

// Configure and validate options
services.Configure(configureOptions);
services.PostConfigure<ServiceOptions>(options => {
// Take the fully configured options and run validation checks...
if (options.Option1 == null) {
throw new Exception("Option1 has to be specified");
}
});
}
}

关于c# - ASP.Net-Core 选项验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49651259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com