延迟加载属性是另一个属性的JsonConvert.DeserializeObject

时间:2019-04-03 13:09:43

标签: c# .net-core json.net

我正在使用npgsql驱动程序设置使用EF Core和PostgreSQL配对的应用程序。我在PostgreSQL中使用[jsonb]字段类型,但它仅映射回我的数据模型中的字符串属性。

public class MyModel
{
     [Column(TypeName = "jsonb")]
     public string JsonData { get; set; }
}

我想将JsonData字段作为Dictionary属性访问。下面的代码有效,但是对JsonDataDictionary而言,每次访问(缓存)时都会对其进行重新构建,这对我来说是浪费的。

public class MyModel
{
     [Column(TypeName = "jsonb")]
     public string JsonData { get; set; }

     public Dictionary<string,string> JsonDataDictionary
     {
        get
        {
            return JsonConvert.DeserializeObject<Dictionary<string, string>>(JsonData);
        }
     }
}

我可以第一次存储反序列化的对象,然后每次返回。但是... JsonData属性可能会发生变化,因此需要重新构建字典。

public class MyModel
{
     [Column(TypeName = "jsonb")]
     public string JsonData { get; set; }

     private Dictionary<string,string> JsonDataDictionary; 
     public Dictionary<string,string> JsonDataDictionary
     {
        get
        {
            if (_JsonDataDictionary == null)
            {
                 _JsonDataDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(JsonData);
            }

            return _JsonDataDictionary;
        }
     }
}

我曾考虑过使用某种标志来跟踪JsonData属性的“肮脏性”,但这似乎并不是最佳实践。

public class MyModel
{
    private string _JsonData;
    private bool _JsonDataChanged = true;

    [Column(TypeName = "jsonb")]
    public string JsonData
    {
        get
        {
            return _JsonData;
        }
        set
        {
            _JsonData = value;
            _JsonDataChanged = true;
        }
    }

    private Dictionary<string,string> _JsonDataDictionary;

    [NotMapped]
    public Dictionary<string,string> JsonDataDictionary
    {
        get
        {
            if (_JsonDataDictionary == null || _JsonDataChanged)
            {
                _JsonDataDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(_JsonData);
                _JsonDataChanged = false;
            }

            return _JsonDataDictionary;
        }
    }
}

有人知道有更好的方法吗?

目标:每次调用字典时都不会运行反序列化。浪费尽可能少的周期。意识到EF Core有时会缓存一堆这样的对象,因此我只希望字典对象在第一次访问时(或JsonData字符串更改时)延迟加载。

我已经阅读了Lazy初始化,但是因为JsonDataDictionary依赖于JsonData字符串,所以我认为Lazy的静态性质不起作用。参见:https://docs.microsoft.com/en-us/dotnet/framework/performance/lazy-initialization

0 个答案:

没有答案