我使用的是dotnet核心3.1。
我有一个类,我想成为它的确定已经设置了自定义记录器属性,所以我将其添加到构造函数中:
class ConsolidatedPortfolio
{
public ConsolidatedPortfolio(StructuredLogger sl)
{
Sl = sl;
}
public StructuredLogger Sl { get; }
}
在创建ConsolidatedPortfolio
的代码中,使用Newtonsoft时如何将StructuredLogger
对象传递给构造函数。Json反序列化?
下面的行为我提供了一个对象,该对象的数据从JSON中正确填充,但显然其Sl
属性为null。
var consolPortf = JsonConvert.DeserializeObject<ConsolidatedPortfolio>(consolPortJson);
我希望能够请求反序列化,并提供要在新创建的ConsolidatedPortfolio
对象上设置的StructuredLogger
对象。
请注意,consolPortJson
与StructuredLogger
无关。JSON字符串包含有关合并投资组合的信息:名称、值等。StructuredLogger
是一个包含ILogger
的类型。它有一个LogInfo
方法,这意味着以一致的方式记录内容。我意识到我可以更改ConsolidatedPortfolio
上的StructuredLogger
属性以包括set
,并在反序列化后分配它,但我想知道在反序列化期间是否可以使用构造函数参数。
要在反序列化期间将记录器注入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