将一组 .NET Core 配置部分绑定到 class 或列表 <class>

Bind an array of .NET Core configuration sections to a class or List<class>

我认为在配置文件中定义错误报告数据会很有用,比如 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 的内置配置管理 classes 来定义 class,然后相当直接地绑定 class ,或 class 中的项目列表,以便我可以这样引用它们:

(UPDATE 自从我第一次发布以来,我在下面扩展了我的示例,以更清楚地显示我的想法。我希望能够查找并使用错误基于其名称的定义,而不必将每个定义包装在单独的 class 中。本质上是一个字典,应用程序不会在语义上知道每个条目的含义。

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

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

{
  ...
  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 中迷路了。部分组、部分集合、部分组集合;其中一些是可数的,有些则不是。有什么建议吗?

您似乎想将 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": ""
    }
  }
}

结果: