.NET Core 7:从appsettings获取包含空值的列表

3

我正在使用dotnet core 6/7,并尝试绑定一个Settings列表。

想象一下以下的appsettings:

{
  "parameters": [
    null,
    null,
    {
       "name": "test"
    }
  ]
}

与以下模型一起:
public class ParameterDefinition : List<Parameter?> {}

public class Parameter {
  public string Name { get; set; }
}

这些在ConfigureServices部分的某个位置进行配置:

services.Configure<ParameterDefinition>(Configuration.GetSection("parameters"));

配置提供程序显示正确的条目,例如:
"parameters:0": "",
"parameters:1": "",
"parameters:2:name": "test"

当通过依赖注入(IOptions<ParameterDefinition>)获取配置时,ParameterDefinition只包含一个元素,但它应该有三个,其中前两个为null。
我应该如何正确地获取包含null值的列表?

你说过,“ConfigurationProvider显示了正确的条目,如下所示:”,但事实并非如此,因为你看到的是空字符串,而不是null值。我认为你的问题与这个有关:https://github.com/dotnet/runtime/issues/36510 - Lukasz Szczygielek
你说过:“ConfigurationProvider显示了正确的条目,如:”,但事实并非如此,因为你看到的是空字符串,而不是null值。我认为你的问题与这个有关:https://github.com/dotnet/runtime/issues/36510 - Lukasz Szczygielek
你说过:“ConfigurationProvider显示了正确的条目,如下所示:”,但事实并非如此,因为你看到的是空字符串,而不是null值。我认为你的问题与这个有关:https://github.com/dotnet/runtime/issues/36510 - undefined
2个回答

0
我曾经遇到过你现在面临的同样问题。在ConfigureServices方法中,我添加了以下代码行:
var appSettings = new AppSettings();
services.Configure<AppSettings>Configuration.GetSection(nameof(AppSettings)));

Configuration.GetSection(nameof(AppSettings)).Bind(appSettings);

在上面的代码中,我还创建了一个AppSettings类,主要是使用setter和getter方法。

0
正如你所指出的,ConfigurationProvider 包含了所有的条目;那些 null 的条目已经变成了空字符串。在处理到设置类时,这些地方就会丢失。
为了解决这个问题:
  1. Parameter 类声明为一个 struct
public struct Parameter
{
    public Parameter()
    { }

    public string Name { get; set; } = default!;
}

更新:根据您在此帖子上的评论,这已足以解决问题。

下面的步骤2和3是可选的。将它们保留在这里供将来参考,以防某人的设置模型看起来类似。


ParameterDefinition类从继承List<T>的方式改为拥有一个类型为Parameter?的数组(或List<T>)属性的class
public class ParameterDefinition
{
    public Parameter?[] Parameters { get; set; } = default!;

    // Or public List<Parameter?> Parameters { get; set; } = default!;

}

IOptions<ParameterDefinition>注册如下。 JSON结构可以保持不变。
services.AddOptions<ParameterDefinition>().BindConfiguration("");

由于您的json设置中没有"ParameterDefinition"元素/部分,因此将空字符串传递给BindConfiguration
或者,您可以调用已经使用的Configure方法,但这需要一个额外的ParameterDefinition json包装器元素/部分。
services.Configure<ParameterDefinition>(Configuration.GetSection("ParameterDefinition"));

"ParameterDefinition": {
  "Parameters": [
    {
      "Name": "test"
    },
    null,
    null
  ]
}

现在当注入一个 `IOptions` 实例时,它将包含 3 个项目;1 个 `Parameter` 实例和 2 个 `null` 值。

enter image description here


谢谢你给我正确的解决方案!只需要将类型定义从class改为struct就足够了。 - Garfield
谢谢你给我正确的解决方案!只需要将类型定义从class改为struct就足够了。 - Garfield

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接