c# - 如何在反序列化期间通过构造函数参数将记录器注入对象
问题描述
我正在使用 dotnet 核心 3.1。
我有一个类,我想确保已为其设置了自定义记录器属性,因此我将其添加到构造函数中:
class ConsolidatedPortfolio
{
public ConsolidatedPortfolio(StructuredLogger sl)
{
Sl = sl;
}
public StructuredLogger Sl { get; }
}
在创建 a 的代码中ConsolidatedPortfolio
,如何StructuredLogger
在使用 Newtonsoft.Json 反序列化时将对象传递给构造函数?
以下行给了我一个从 JSON 正确填充数据的对象,但显然它的Sl
属性为空。
var consolPortf = JsonConvert.DeserializeObject<ConsolidatedPortfolio>(consolPortJson);
我希望能够请求反序列化并提供StructuredLogger
要在新创建的对象上设置的ConsolidatedPortfolio
对象。
请注意,consolPortJson
与StructuredLogger
. JSON 字符串包含有关合并投资组合的信息:名称、价值等StructuredLogger
是包含ILogger
. 它有一种LogInfo
方法,意味着以一致的方式记录内容。我意识到我可以将StructuredLogger
属性更改ConsolidatedPortfolio
为包含 aset
并在反序列化后分配它,但想知道是否可以在反序列化期间使用构造函数参数。
解决方案
要在反序列化期间将记录器注入ConsolidatedPortfolio
对象,您需要为其创建一个自定义JsonConverter
类:
class ConsolidatedPortfolioConverter : CustomCreationConverter<ConsolidatedPortfolio>
{
private StructuredLogger StructuredLogger { get; set; }
public ConsolidatedPortfolioConverter(StructuredLogger sl)
{
StructuredLogger = sl;
}
public override ConsolidatedPortfolio Create(Type objectType)
{
return new ConsolidatedPortfolio(StructuredLogger);
}
}
当你想反序列化时,用你想使用的记录器构造转换器,然后将转换器传递给DeserializeObject
方法:
var converter = new ConsolidatedPortfolioConverter(structuredLogger);
var consolPortf = JsonConvert.DeserializeObject<ConsolidatedPortfolio>(consolPortJson, converter);
这是一个工作演示:https ://dotnetfiddle.net/OT324B
推荐阅读
- model-view-controller - 为 yii2 中的所有模块创建通用页眉页脚
- node.js - Twitter 视频媒体上传不起作用:错误:HTTP 错误:400 错误请求
- android - Oreo 8.0,8.1:SpannableStringBuilder.setSpan 的 IndexOutOfBoundsException
- php - 如何使用 PHP 从动态域中提取信息
- c# - 加载时如何在c#,winForm中锁定组合框?
- linux - Gerrit2 用户的 root 访问权限最近被删除,发布 gitweb 选项不起作用。gerrit用户是否必须具有root访问权限?
- javascript - 如果选项对象不存在,则将布尔值设置为默认值
- c# - 使用 WebMethod 从数组中获取值
- angular - 将 Angular http 调用迁移到 v6
- c# - 必须在数据库上搜索查询,例如名称并吐出任何相似的内容