2010-05-05 9 views
5

En métodos web, es muy simple implementar el almacenamiento en caché anotando el atributo [WebMethod (CacheDuration ...]. ¿Podemos crear algo similar para métodos no web, como métodos estáticos?Usar atributos para almacenar en caché los resultados de un método en C#

Cualquier ayuda/consejo es apreciado.

+0

Tengo curiosidad de por qué. No creo que sea posible. –

+0

Alastair, la razón es porque no quiero dejar mi implementación de caché en todos lados en mis métodos. En segundo lugar, tengo un montón de métodos estáticos (sin miembros estáticos o contexto) por lo que tener el caché implementado para cada uno consume mucho tiempo y es complicado. Supongo que solo estoy buscando una manera fácil. ¡Y la Programación Orientada a los Aspectos ayudará con seguridad! Gracias a todos. –

+0

@SP. ¿Encontraste alguna solución declarativa para atrapar? – Kuncevic

Respuesta

4

no hay se construye en función de lograr exactamente lo que quiere. usted debe utilizar Httpruntime.Cache.

no es una función incorporada pero puede lograr algo por el estilo utilizando la programación orientada a aspectos (AOP). Información de almacenamiento en caché utilizando aspectos.

En caso de que esté interesado Spring.NET proporciona AOP

+0

Gracias por responder, Claudio. AoP puede ayudar, pero no es posible para el proyecto en este momento. Entonces, la mejor alternativa es Attribute. ¿Todavía no podemos usar HttpRuntime.Cache con atributos? Si es así, ¿algún indicador sobre cómo lograrlo? –

+0

@SP: me temo que tienes que hacerlo programáticamente, no puedes usar atributos. –

+0

Los atributos @SP no son más que metadatos incrustados en el ensamblaje. Necesitarías algo para leer esos metadatos e interceptar la llamada al método. Esto es exactamente lo que hace AOP. Entonces, una solución de solo atributo es imposible. – Josh

1

Si no puede utilizar AOP para conseguir el trabajo hecho esto se podría tratar de usar esta pequeña clase I en su conjunto.

public MyClass CachedInstance 
{ 
    get { return _cachedInstance.Value; } 
} 
private static readonly Cached<MyClass> _cachedInstance = new Cached<MyClass>(() => new MyClass(), TimeSpan.FromMinutes(15)); 

public sealed class Cached<T> 
{ 
    private readonly Func<T> _createValue; 
    private readonly TimeSpan _cacheFor; 
    private DateTime _createdAt; 
    private T _value; 


    public T Value 
    { 
     get 
     { 
      if (_createdAt == DateTime.MinValue || DateTime.Now - _createdAt > _cacheFor) 
      { 
       lock (this) 
       { 
        if (_createdAt == DateTime.MinValue || DateTime.Now - _createdAt > _cacheFor) 
        { 
         _value = _createValue(); 
         _createdAt = DateTime.Now; 
        } 
       } 
      } 
      return _value; 
     } 
    } 


    public Cached(Func<T> createValue, TimeSpan cacheFor) 
    { 
     if (createValue == null) 
     { 
      throw new ArgumentNullException("createValue"); 
     } 
     _createValue = createValue; 
     _cacheFor = cacheFor; 
    } 
} 
+0

Estoy buscando una forma más declarativa de almacenar en caché, por lo que las soluciones AoP encajan mucho mejor. Si todo falla, tengo que hacerlo de la manera difícil, dejando las entrañas del caché en todas partes. ¡Sucio! –

2

Comprobar this sencilla implementación de un atributo para el almacenamiento en caché usando Mensaje de Sharp.

+0

PostSharp es genial y hace exactamente lo que quiero. Gran alternativa comercial Gracias, Fernando. –

+0

También tiene una edición communty. Verifica la página de descarga. – Fernando

Cuestiones relacionadas