2010-04-06 7 views
1

Je ne sais pas si c'est possible.Cache Wrapper avec des expressions

Je veux qu'une classe encapsule tout le cache de mon site. Je pense à la meilleure façon de le faire pour éviter les conflits avec les clés.

Ma première idée est quelque chose comme ceci:

public static TResult Cachear<TResult>(this Cache cache, Expression<Func<TResult>> funcao) 
    { 
     string chave = funcao.ToString(); 

     if (!(cache[chave] is TResult)) 
     { 
      cache[chave] = funcao.Compile()(); 
     } 

     return (TResult)cache[chave]; 
    } 

est la meilleure façon? Ty

Répondre

1

Expression.ToString() est plutôt cher.

L'autre problème est que Expression sont toujours des objets fraîchement créés, donc ils n'auront jamais la même référence, donc l'utiliser comme une clé est problématique. Un dernier problème (qui ne vous affecte pas (encore)), tient compte de toutes les combinaisons de paramètres possibles.

La seule chose que je peux suggérer est d'oublier Expression, et il suffit d'utiliser Func<R> directement.

+0

Expression avantage sur Func son exactement sur les paramètres. ToString retourne l'expression entière. Je ne comprends pas le problème avec la clé. C'est une chaîne. PS: Ops, noms de paramètres de retour d'expression, dont values ​​=/ –

+0

@Fujiy: La méthode ToString est chère par rapport à une recherche très rapide, et peut-être même à la compilation de l'expression. – leppie

+0

Le principal problème est comment obtenir une chaîne unique basée sur les paramètres et le nom de la méthode –

Questions connexes