.net 尽管GetSection工作,iOptions仍返回null

lb3vh1jj  于 2023-03-31  发布在  .NET
关注(0)|答案(3)|浏览(149)

我目前正在尝试将appsettings.json的值读入一个变量。GetSection()成功地读取了这些值,但一旦我尝试将这些值用于变量,它只会返回null。我找到的解决方案都不起作用。

Json文件

{
  "Categories": {
    "Over29EUR": [
      {
        "Status": "DO1",
        "CaseMemo": "Over 29",
        "CopyOldData": false,
        "OverwriteData": false,
        "DeleteOldEvent": true,
        "NextEvent": "next",
        "CaseMemoManualCheck": "",
        "Team": "",
        "NewStatus": "new"
      },
      {
        "Status": "DO2",
        "CaseMemo": "Over 29",
        "CopyOldData": false,
        "OverwriteData": false,
        "DeleteOldEvent": true,
        "NextEvent": "next",
        "CaseMemoManualCheck": "",
        "Team": "",
        "NewStatus": "new"
      },
      {
        "Status": "DO3",
        "CaseMemo": "Over 29",
        "CopyOldData": false,
        "OverwriteData": false,
        "DeleteOldEvent": true,
        "NextEvent": "next",
        "CaseMemoManualCheck": "",
        "Team": "",
        "NewStatus": "new"
      }
    ]
  }
}

程序.cs

private static IConfiguration config;

    static void Main(string[] args)
    {
        config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("Resources\\appsettings.json", optional: false)
            .Build();

        var serviceProvider = new ServiceCollection()    
            .Configure<ConfigurationFile>(config.GetSection("Categories"))
            .AddSingleton<IConfiguration>(Program.config)
            .AddSingleton<IOrchestrator, CaseOrchestrator>()
            .AddOptions()
            .BuildServiceProvider();

        var orchestrator = serviceProvider.GetRequiredService<IOrchestrator>();

        orchestrator.Execute();

    }

班级

public class ConfigurationFile
    {
        public Categories Categories { get; set; }
    }
///////////////////////////////////////////////////////////
    public class Categories
    {
       public Category Over29EUR { get; set; }
       public Category Under29EUR { get; set; }
    }
///////////////////////////////////////////////////////////
    public class Category
    {
        public List<ZMRCase> ZMRCases { get; set; }
    }
///////////////////////////////////////////////////////////
    public class ZMRCase
    {
        public string Status { get; set; }
        public string CaseMemo { get; set; }
        public bool? CopyOldData { get; set; }
        public bool? OverwriteData { get; set; }
        public bool? DeleteOldEvent { get; set; }
        public string NextEvent { get; set; }
        public string CaseMemoManualCheck { get; set; }
        public string Team { get; set; }
        public string NewStatus { get; set; }
    }

Orchestrator(我尝试在其中获取值)

internal class CaseOrchestrator : IOrchestrator
    {
        private readonly ConfigurationFile _configuration;

        public CaseOrchestrator(IOptions<ConfigurationFile> configuration)
        {
            _configuration = configuration.Value;
        }

        public void Execute()
        {
            var x = _configuration;
        }
    }

谢谢!

esyap4oy

esyap4oy1#

修复Categories模型:

public class Categories
{
    public List<ZMRCase> Over29EUR { get; set; }
    public List<ZMRCase> Under29EUR { get; set; }
}

另外,如果您正在解析具体的Categories部分,那么您也需要省略ConfigurationFile-Configure<Categories>(config.GetSection("Categories"))
它直接包含2个ZMRCase的集合,而没有中间的Category

3phpmpom

3phpmpom2#

因为这不是正确的阶级模式。
正确的应该是这样的:

public class ConfigurationFile
{
    public Categories Categories { get; set; }
}

public class Categories
{
    public List<ZMRCase> Over29EUR { get; set; }
    public List<ZMRCase> Under29EUR { get; set; }
}

public class ZMRCase
{
    public string Status { get; set; }
    public string CaseMemo { get; set; }
    public bool CopyOldData { get; set; }
    public bool OverwriteData { get; set; }
    public bool DeleteOldEvent { get; set; }
    public string NextEvent { get; set; }
    public string CaseMemoManualCheck { get; set; }
    public string Team { get; set; }
    public string NewStatus { get; set; }
}
9rygscc1

9rygscc13#

如果添加包Microsoft.Extensions.Configuration.Binder,则可以简化. NET类的使用。
就这么做:

var builder = new ConfigurationBuilder().SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
                                                .AddJsonFile("appsettings.json");

        config = builder.Build();

        var cat1 = config.GetSection("Categories")
                         .GetSection("Over29EUR")
                         .Get<List<ZMRCase>>();
        var cat2 = config.GetSection("Categories")
                         .GetSection("Under29EUR")
                         .Get<List<ZMRCase>>();

你可以很容易地在cat1和cat2之间循环
另一种写法:

var cat1 = config.GetSection("Categories:Over29EUR")
                         .Get<List<ZMRCase>>();

相关问题