gpt4 book ai didi

asp.net-core - 如何在 .NET Core 中选择 IOptions 部分?

转载 作者:行者123 更新时间:2023-12-04 04:07:23 25 4
gpt4 key购买 nike

考虑一个可选地支持 LDAP 身份验证的示例服务,否则,它会执行类似于本地身份身份验证的操作。完全配置 LDAP 后,appsettings.json 可能如下所示...

{
"LdapOptions": {
"Host": "ldap.example.com",
"Port": 389
}
}

带有选项类。

public class LdapOptions
{
public string Host { get; set; }
public int Port { get; set; } = 389;
}

并且 Startup 具有预期的 Configure 调用。

service.Configure<LdapOptions>(nameof(LdapOptions));

当我有一个完整有效的“LdapOptions”部分时,这很好用。但是,如果我故意将该部分从我的 appsettings 中删除,那就不是很好了。

即使我将该部分完全排除在我的 appsettings 之外, IOptions<TOptions> 实例也会解析;如果我完全删除启动配置调用,它甚至可以解决!我得到一个基于属性值显示为 default(TOptions) 的对象。

public AuthenticationService(IOptions<LdapOptions> ldapOptions)
{
this.ldapOptions = ldapOptions.Value; // never null, sometimes default(LdapOptions)!
}

如果某个部分被故意遗漏,我不想依赖于检查属性。我可以想象一个对象中的所有属性都具有显式默认值的场景,而这是行不通的。我想要带有 Maybe<TOptions> 属性的 HasValue 之类的东西,但我会选择 null

有没有办法让选项部分成为可选的?

更新: 请注意,我还打算验证数据注释...

services.AddOptions<LdapOptions>()
.Configure(conf.GetSection(nameof(LdapOptions)))
.ValidateDataAnnotations();

所以,我真正想要的是当该部分丢失( conf.Exists() == false )时 optional 有效,然后在部分或完全填写该部分时进行正常验证。

我无法想象任何使用数据注释验证的解决方案取决于创建默认实例的行为(例如,主机没有正确的默认值,因此默认实例将始终无效)。

最佳答案

IOptions<T> 的整个想法是具有非空的默认值,以便您的设置文件不包含数百/数千个部分来配置整个 ASP 管道

因此,从您将获得 null 的意义上说,不可能使其成为可选的,但是您始终可以定义一些“魔术”属性来指示是否已配置:

public class LdapOptions
{
public bool IsEnabled { get; set; } = false;
public string Host { get; set; }
public int Port { get; set; } = 389;
}

和您的应用设置文件:
{
"LdapOptions": {
"IsEnabled: true,
"Host": "ldap.example.com",
"Port": 389
}
}

现在,如果您在设置中始终将 'IsEnabled' 保持为 'true',如果 IsEnabled 为 false,则意味着缺少该部分。

另一种解决方案是使用不同的设计方法,例如将身份验证类型放在设置文件中:
public class LdapOptions
{
public string AuthType { get; set; } = "Local";
public string Host { get; set; }
public int Port { get; set; } = 389;
}

以及您的应用设置:
{
"LdapOptions": {
"AuthType : "LDAP",
"Host": "ldap.example.com",
"Port": 389
}
}

这是 IMO 一种更清洁、更一致的方法

如果你 必须 有一个基于可用/缺失部分的逻辑,你也可以直接配置它:
var section = conf.GetSection(nameof(LdapOptions));
var optionsBuilder = services.AddOptions<LdapOptions>();

if section.Value != null {
optionsBuilder.Configure(section).ValidateDataAnnotations();
}
else {
optionsBuilder.Configure(options => {
// Set defaults here
options.Host = "Deafult Host";
}
}

关于asp.net-core - 如何在 .NET Core 中选择 IOptions 部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62274008/

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