asp.net-core - 将一组 .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;其中一些是可数的,有些不是。有小费吗?
解决方案
您似乎希望将 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": ""
}
}
}
结果:
推荐阅读
- google-apps-script - 为什么我的 Google Scipt 函数的运行时间取决于它所在的项目?
- javascript - React.js 迭代 JSON 并根据数组中的 ID 计数插入 Card 组件
- python - 如何使用 Python Flask 将图像文件上传到 oracle 数据库
- reactjs - 材料表第三状态对列进行排序
- c# - 从 C# 运行 .ps1 Powershell - 不工作
- asp.net-core-signalr - SignalR Core 跟踪连接的用户
- dll - 确定一种简单而彻底的方式来验证 ASP.NET Web 窗体是否正确部署在独立的 Microsoft IIS 服务器上?
- python - Pandas – 具有数值阈值类别的 Groupby?
- azure - Azure DNS:如何配置 ALIAS 记录以指向某个外部域?
- java - 处理多种对象类型 - 可以简化代码吗?(使用JAXB读写xml)