2017-08-29 4 views
0

This article beschreibt, wie effiziente DisplayDrivers für Ihre Teile geschrieben werden, so dass teurer Code nur ausgeführt wird, wenn die Form tatsächlich angezeigt wird.Wie effizient mehrere DriverResults von der Methode Display zurückgegeben werden?

protected override DriverResult Display(MyPart part, string displayType, dynamic shapeHelper) 
{ 
    // return the shape 
    return ContentShape("Parts_MyPart",() => { 
     // do computations here 
     return shapeHelper.Parts_MyPart(); 
    }); 
} 

Nun möchte Ich mag einen Teil machen, die mehrere DriverResults mit der Combine Methode gibt, mit jedem DriverResult meist die gleichen Daten enthalten, die aus der Datenbank abgerufen wird. Das Problem ist, ich denke nicht an eine gute Möglichkeit, es effizient zu machen, da Combine keinen Func-Parameter nimmt.

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", ... 
    ); 
} 

Kann ich das gleiche Ergebnis erzielen, so dass die Abfrage nicht ausgeführt wird, wenn nichts angezeigt wird und nur einmal ausgeführt, wenn mehrere Formen dargestellt?

Ich möchte dies tun, damit ich die gleichen Daten auf einem ContentItem-Detail in verschiedenen Zonen mit unterschiedlichen Markup und Styling anzeigen kann. Ein alternativer Ansatz könnte darin bestehen, eine Form zurückzugeben, die wiederum andere Formen in andere Bereiche verschiebt, aber dann würde ich die Fähigkeit verlieren, die Positionierung einzeln zu steuern.

+1

Und halten Sie diese Treiber effizient! http://arkleseizure.net/dont-let-the-designer-ruin-your-drivers-performance – Hazza

+0

Sie könnten ein Backing-Feld verwenden, erstellen Sie eine Methode, die überprüft, ob das Backing-Feld nicht null ist, dann gibt es zurück, sonst es löst die teure Abfrage aus und setzt sie auf das Backing-Feld – devqon

Antwort

1

Ich würde wahrscheinlich einen trägen Bereich zu Ihrem Teil hinzufügen.

Es wird nur berechnet, wenn es geladen ist und alle Formen den berechneten Wert teilen.

+1

Ich habe dieses Prinzip sofort an mehreren Stellen angewendet und meine durchschnittliche Performance massiv verbessert. Ausgezeichnete Lösung. – Lawyerson

Verwandte Themen