2017-08-29 105 views
0

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

回答

1

我可能會爲您的零件添加一個懶惰的字段。

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