如何从 Display 方法中高效地 return 多个 DriverResults?
How to efficiently return multiple DriverResults from the Display method?
This article 描述了如何为您的部件编写高效的显示驱动程序,以便仅在实际显示形状时才执行昂贵的代码。
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
方法制作 return 多个 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 的详细信息上显示相同的数据。另一种方法可能是 return 一个形状反过来将其他形状推入不同的区域,但这样我就无法使用 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);
});
}
}
只有在加载时才会计算,所有形状都会共享计算值。
This article 描述了如何为您的部件编写高效的显示驱动程序,以便仅在实际显示形状时才执行昂贵的代码。
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
方法制作 return 多个 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 的详细信息上显示相同的数据。另一种方法可能是 return 一个形状反过来将其他形状推入不同的区域,但这样我就无法使用 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);
});
}
}
只有在加载时才会计算,所有形状都会共享计算值。