如何从Display方法有效地返回多个DriverResults?
问题描述:
This article描述了如何为零件编写高效的DisplayDrivers,以便只有在实际显示形状时才执行昂贵的代码。现在如何从Display方法有效地返回多个DriverResults?
protected override DriverResult Display(MyPart part, string displayType, dynamic shapeHelper)
{
// return the shape
return ContentShape("Parts_MyPart",() => {
// do computations here
return shapeHelper.Parts_MyPart();
});
}
我想使该返回使用Combine
方法多重DriverResults一个部分中,与含有大部分是相同的数据中的每个DriverResult,其是从所述数据库中获取。问题是我想不出一个好的方法来使它高效,因为Combine
不带一个Func参数。
protected override DriverResult Display(MyPart part, string displayType, dynamic shapeHelper)
{
var data = ... // expensive query specific to the part
return Combined(
ContentShape("Parts_MyPart_A",() => shapeHelper.Parts_MyPart_A(
Data: data
)),
ContentShape("Parts_MyPart_B",() => shapeHelper.Parts_MyPart_B(
Data: data
)),
ContentShape("Pars_MyPart_C", ...
);
}
我可以达到同样的效果,这样,如果什么都不显示,不执行查询,只有一次当显示多个形状执行?
我想这样做,因此我可以在不同区域以不同的标记和样式在ContentItem的Detail中显示相同的数据。另一种方法可能是返回一个形状,反过来将其他形状推入不同的区域,但后来我失去了使用Placement分别控制它们的能力。
答
我可能会为您的零件添加一个懒惰的字段。
public class MyPart : ContentPart {
internal readonly LazyField<CustomData> CustomDataField = new LazyField<CustomData>();
public CustomData CustomData {
get { return CustomDataField.Value; }
}
}
public class CustomData {
...
}
public class MyPartHandler : ContentPartHandler {
private ICustomService _customService;
public MyPartHandler(ICustomService customService){
_customService = customService;
OnActivated<MyPart>(Initialize);
}
private void Initialize(ActivatedContentContext context, MyPart part){
part.CustomDataField.Loader(() => {
return _customService.Get(part.ContentItem.Id);
});
}
}
只有当它被加载并且所有形状将共享计算值时才会被计算。
+1
我立即在几个地方应用此原则,并大幅提高了我的平均性能。优秀的解决方 – Lawyerson
并保持这些驱动程序高效! http://arkleseizure.net/dont-let-the-designer-ruin-your-drivers-performance – Hazza
你可以使用支持字段,创建一个方法来检查支持字段是否为空,然后返回它,否则它触发昂贵的查询并将其设置在支持字段 – devqon