2017-08-29 6 views
0

This article décrit comment écrire des DisplayDrivers efficaces pour vos pièces afin que le code coûteux ne soit exécuté que lorsque la forme est réellement affichée.Comment renvoyer efficacement plusieurs DriverResults à partir de la méthode Display?

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

Maintenant, je voudrais faire une partie qui renvoie plusieurs DriverResults en utilisant la méthode Combine, chaque DriverResult contenant essentiellement les mêmes données, qui sont extraites de la base de données. Le problème est que je ne peux pas penser à un bon moyen de le rendre efficace, puisque Combine ne prend pas un paramètre 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", ... 
    ); 
} 

Puis-je obtenir le même résultat pour que la requête n'est pas exécutée si rien ne s'affiche et exécutée une seule fois si plusieurs formes sont affichées?

Je veux faire cela afin que je puisse afficher les mêmes données sur les détails d'un ContentItem dans différentes zones avec différents balisage et style. Une approche alternative pourrait être de retourner une forme qui à son tour pousse d'autres formes dans des zones différentes, mais alors je perdrais la possibilité d'utiliser le placement pour contrôler chacun d'eux individuellement.

+1

Et gardez ces pilotes efficaces! http://arkleseizure.net/dont-let-the-designer-ruin-your-drivers-performance – Hazza

+0

Vous pouvez utiliser un backing field, créer une méthode qui vérifie si le backing field n'est pas nul, puis le retourne, sinon il déclenche la requête coûteuse et la place sur le backing field – devqon

Répondre

1

Je ajouterais probablement un champ paresseux à votre partie. Elle ne sera calculée que si elle est chargée et que toutes les formes se partageront la valeur calculée.

+1

J'ai immédiatement appliqué ce principe à plusieurs endroits et cela a massivement amélioré ma performance moyenne. Excellente solution – Lawyerson