Web API JSON 反序列化在 setter 之前调用 getters



我有一个名为 Menu 的类。菜单具有专用列表变量_Sections和公共列表变量部分。我使用以下模式进行延迟加载。这也允许我在序列化时检索子项

public class Menu 
{
public int Id;
private List<MenuSection> _Sections = null;
public List<MenuSection> Sections
{
get
{
return _Sections ?? (_Sections = MenuSection.GetListByMenu(Id)); //database call
}
set
{
_Sections = value;
}
}
}

然后,我修改收集客户端并将其作为 JSON 发送回 API。

我的问题是在设置器之前调用了部分的获取器。这意味着从数据库中重新填充集合,然后附加我现在更新的部分。

我已经创建了以下解决方法,但它很丑陋,我不想记住在我想延迟加载的任何地方都这样做。

public class Menu 
{
public int Id;
private bool deserialized = false;
[OnDeserializing()]
internal void OnDeserializingMethod(StreamingContext context)
{
DeserializerCalled = true;
}
private List<MenuSection> _Sections = null;
public List<MenuSection> Sections
{
get
{
return _Sections ?? (_Sections = DeserializerCalled ? new List<>() : MenuSection.GetListByMenu(Id));
}
set
{
_Sections = value;
}
}
}

我是否缺少一些可以为我解决此问题的属性属性或全局 JSON 设置?

问题是你的getter实际上是在设置变量,你只是在与框架作斗争。get 块应该只返回_Sections集合的值。为什么不考虑使用 C# 4 中引入的惰性结构?

private Lazy<List<MenuSection>> _someVariable = new Lazy<List<MenuSection>>(() => MenuSection.GetListByMenu(id));
public string SomeVariable => _someVariable

作为旁注,我建议在这里遵循正确的命名约定,并在骆驼案例中拥有私人成员:_sections。

最新更新