如何从 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);
         });
   }
}

只有在加载时才会计算,所有形状都会共享计算值。