【发布时间】:2019-08-02 08:39:37
【问题描述】:
我正在尝试在客户端的模型上实现一些延迟加载逻辑。
我试图将逻辑放在这些属性的 getter 中,但我现在意识到,当创建对象并将其分配给变量时,它会触发属性的所有 getter,从而触发延迟加载逻辑。
模型类:
public class ProductStructure
{
public override Guid Id { get; set; }
private List<AbstractStructureNode> subNodes;
public override List<AbstractStructureNode> SubNodes
{
get
{
// Lazy loading logic including API calls to set subNodes
return subNodes;
}
set
{
subNodes = value;
}
}
}
API:
public async Task<ProductStructure> GetLightProductStructure(Guid Id)
{
if (Id == Guid.Empty)
return null;
string uri = ServiceUri + $"ProductStructures/Light/{Id}";
using (var client = new HttpClient())
{
HttpResponseMessage response = client.GetAsync(uri).Result;
if (!response.IsSuccessStatusCode)
{
return null;
}
else
{
string content = await response.Content.ReadAsStringAsync();
try
{
JsonSerializerSettings settings = new JsonSerializerSettings()
{
Formatting = Formatting.None,
TypeNameHandling = TypeNameHandling.Auto,
SerializationBinder = new CustomJsonSerializer("R3.ProductStructureSDK.DataModel", "R3.ProductStructureSDK")
};
return JsonConvert.DeserializeObject<ProductStructure>(content, settings);
}
catch (Exception e)
{
return null;
}
}
}
}
触发延迟加载的赋值(单元测试的一部分)
ProductStructure LightProduct = await ProductStructureManager.Instance.GetLightProductStructure(RootId);
从服务器下载 ProductStructure 时,其子节点为空。但是将 API 返回的 ProductStructure 分配给变量“LightProduct”的简单事实将触发子节点的 getter。 API 使用异步方法,所以我不能使用 ref。
有没有一种通用的方法来延迟加载对象的属性?
【问题讨论】:
-
我不明白您要达到的目标。对您而言,“延迟加载”模型的属性值有什么意义?
-
subNodes 属性可以包含数百个对象。当应用程序需要检索 ProductStructure 时,它不需要立即使用其 subnodes 属性。我简化了模型的代码,实际上它还包含一个描述字符串和其他我们首先需要的属性。
标签: c# lazy-loading variable-assignment getter