如何在反序列化期间通过构造函数参数将记录器注入对象



我使用的是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对象。

请注意,consolPortJsonStructuredLogger无关。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

相关内容

最新更新