martes, 19 de febrero de 2019
Entre otras, el tag helper
<cache> es especialmente útil para almacenar en la memoria del servidor el resultado de procesar una porción de página o vista, de forma que pueda ser reutilizada en peticiones siguientes. Un ejemplo bastante básico, pero que deja bastante clara su utilidad y forma de uso, podría ser el siguiente:<h1>Atomic clock</h1>
<cache expires-after="@TimeSpan.FromSeconds(30)">
    @{
        await Task.Delay(3000);
    }
    Current time: @DateTime.UtcNow.ToLongTimeString()
</cache>
<cache> mostrando la hora actual, y el resultado será almacenado en memoria durante 30 segundos.Si volvemos a acceder a la misma vista durante esos 30 segundos, el resultado será mostrado inmediatamente (sin esperar los tres segundos) y el cliente recibirá el contenido que se cacheó durante la primera visita. Al transcurrir este plazo, en la siguiente petición se volverá a procesar el contenido del tag helper, ejecutándose la espera y volviendo a generar y cachear el resultado enviado al cliente.
Pero podemos tener ejemplos algo más complejos, como el siguiente. En el interior del tag helper hemos insertado un view component que podría mostrar las últimas noticias obtenidas de una base de datos, en lo que podría ser la página de inicio de un servicio de información on-line:
<section>
    <h1>Latest news</h1>
    <cache expires-after="@TimeSpan.FromSeconds(30)">
        <vc:latest-news></vc:latest-news>
        <p>
            Updated at: @DateTime.UtcNow.ToLongTimeString()
        </p>
    </cache>
</section>
Invalidar el contenido de la caché
Cuando nos encontramos con escenarios como ese, donde queremos invalidar el contenido de la caché ante determinados eventos, quizás nos venga bien conocer el atributovary-by del tag helper <cache>.Su forma de uso es muy sencilla: basta con indicar con ese atributo una expresión de cadena cuya modificación implicará la invalidación automática del contenido de la caché. Por ejemplo, en el siguiente código forzaremos a que esto ocurra cuando cambie el valor de una propiedad, en este caso estática, a la que accedemos mediante la expresión
LatestNewsCache.Timestamp:<cache vary-by="@LatestNewsCache.Timestamp">
    <vc:latest-news></vc:latest-news>
    <p>
        Updated at: @DateTime.UtcNow.ToLongTimeString()
    </p>
</cache>
LatestNewCache podría ser algo similar a la mostrada a continuación, donde exponemos un método Invalidate() que forzaría la modificación del timestamp y, por tanto, la invalidación de la caché de noticias:public class LatestNewsCache
{
    public static string Timestamp { get; private set;  }
    public void Invalidate()
    {
        Timestamp = DateTime.UtcNow.Ticks.ToString();
    }
}
public class NewsServices: INewsServices
{
    [...]
    private readonly LatestNewsCache _latestNewsCache;
    public NewsController(LatestNewsCache latestNewsCache, ...)
    {
        [...]
        _latestNewsCache = latestNewsCache;
    }
    public async Task Create(NewsDto newsDto)
    {
        [...]
        // Everything was ok, so let's invalidate the cache
        _latestNewsCache.Invalidate();
    }
}
Publicado en: www.variablenotfound.com.


 
 
 



 
 
 
 
 
 
 
 
 
 
2 Comentarios:
Me parece una característica muy útil y sencilla de implementar.
Muchas gracias por la explicación.
Hola, Carlos!
Pues sí, útil y sorprendentemente sencilla :)
Muchas gracias por comentar!
Enviar un nuevo comentario