如何从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分别控制它们的能力。

+1

并保持这些驱动程序高效! http://arkleseizure.net/dont-let-the-designer-ruin-your-drivers-performance – Hazza

+0

你可以使用支持字段,创建一个方法来检查支持字段是否为空,然后返回它,否则它触发昂贵的查询并将其设置在支持字段 – devqon

我可能会为您的零件添加一个懒惰的字段。

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