首页 > 解决方案 > 如何在反序列化期间通过构造函数参数将记录器注入对象

问题描述

我正在使用 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对象。

请注意,consolPortJsonStructuredLogger. JSON 字符串包含有关合并投资组合的信息:名称、价值等StructuredLogger是包含ILogger. 它有一种LogInfo方法,意味着以一致的方式记录内容。我意识到我可以将StructuredLogger属性更改ConsolidatedPortfolio为包含 aset并在反序列化后分配它,但想知道是否可以在反序列化期间使用构造函数参数。

标签: c#.net-corejson.net

解决方案


要在反序列化期间将记录器注入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


推荐阅读