首页 > 解决方案 > 将一组 .NET Core 配置节绑定到类或列表

问题描述

我认为在配置文件中定义用于错误报告的数据会很有用,例如 errordefinitions.json:

{
  "errorDefinitions": {
    "unsupportedExtension": {
      "errorLevel": 2,
      "doLog": true,
      "logMessage": "The file {0} doesn't have a valid extension for this operation.",
      "doEmail": false,
      "emailSubject": "",
      "emailBody": ""
    },
    "fileOpenFailed": {
      "errorLevel": 3,
      ...
    }
  }
}

或者

[
  {
    "name":"unsupportedExtension",
    "errorLevel": 2,
    "doLog": true,
    "logMessage": "The file {0} doesn't have a valid extension for this operation.",
    "doEmail": false,
    "emailSubject": "",
    "emailBody": ""
  },
  {
    "name": "fileOpenFailed",
    "errorLevel": 3,
    ...
  }
]

无论哪种方式,我的期望是我能够使用 Microsoft 的内置配置管理类来定义一个类,然后相当直接地将一个类或一个类中的项目列表绑定到这些,以便我可以引用它们因此:

更新自从我第一次发布以来,我已经在下面扩展了我的示例,以更清楚地显示我的想法。我希望能够根据其名称查找和使用错误定义,而不必将每个定义包装在单独的类. 一个字典,本质上,应用程序没有语义知道每个条目的含义。

当我向应用程序添加新功能时,我希望能够将新功能可能遇到的任何新错误的数据添加到配置文件中,并按名称解决这些错误,而不必向错误添加新类处理基础设施。

此外,对于它的价值,这是供服务器端使用的——这不是我要返回给客户端的结果。)

{
  ...
  try
  {
    openFile(file);
    ...
  }
  catch (Exception e)
  {
    handleError("fileOpenFailed", file.name);
    ...
  }
  ...
}

public void handleError(string errorName, params object[] values)
{
  ErrorDefinition errorDef = ErrorDefinitions[errorName];
  if (errorDev.doLog)
  {
    writeToLog(
      errorDef.errorLevel,
      String.Format(errorDef.logMessage, values)
    );
  }
  if (errorDef.doEmail)
  {
    sendNotificationToEmailList(
      errorDef.emailSsubject,
      errorDef.emailBody
    );
  }
  ...
}

但我迷失在 API 中。SectionGroups、SectionCollections、SectionGroupCollections;其中一些是可数的,有些不是。有小费吗?

标签: asp.net-coreappsettings

解决方案


您似乎希望将 json 文件数据映射到模型。

这是一个工作演示:

模型:

public class ErrorDefinition
{
    public Dictionary<string, Dictionary<string,string>> errorDefinitions
    {
        get;
        set;
    }
}

控制器:

public ActionResult Index()
{
    var configuration = new ConfigurationBuilder()
                        .SetBasePath(Directory.GetCurrentDirectory())
                        .AddJsonFile("errordefinitions.json", false)
                        .Build();

    var config = configuration.Get<ErrorDefinition>();
    var data = config.errorDefinitions["fileOpenFailed"]
                        .FirstOrDefault(x=>x.Key== "logMessage").Value;
    return View();
}

根项目中的errordefinitions.json:

{
  "errorDefinitions": {
    "unsupportedExtension": {
      "errorLevel": 2,
      "doLog": true,
      "logMessage": "The file {0} doesn't have a valid extension for this operation.",
      "doEmail": false,
      "emailSubject": "",
      "emailBody": ""
    },
    "fileOpenFailed": {
      "errorLevel": 3,
      "doLog": true,
      "logMessage": "The file {0} cannot be opened.",
      "doEmail": false,
      "emailSubject": "",
      "emailBody": ""
    }
  }
}

结果:

在此处输入图像描述


推荐阅读