O objetivo deste artigo é demonstrar a implementação de cache memória no ASP.NET Core, fazendo uso para isto da interface IMemoryCache.

Introdução

A utilização de técnicas de caching corresponde a um tipo de prática relativamente comum em soluções Web, com isto não sendo diferente em projetos desenvolvidos em ASP.NET. Normalmente associado a cenários que exigem uma melhor performance no acesso a sites, o uso de recursos em cache está baseado no armazenamento temporário de dados (geralmente em memória) para possibilitar um processamento mais rápido de requisições.

O ASP.NET Core passou por uma completa reformulação e, como não fica difícil de imaginar, também conta um novo mecanismo para cache. A manipulação de objetos em memória depende agora de implementações da interface IMemoryCache (namespace Microsoft.Extensions.Caching.Memory), com a utilização deste recurso sendo demonstrada em detalhes nas próximas seções.

Exemplo de utilização

Para implementar o projeto apresentado neste artigo foram utilizados como recursos:
  • O Microsoft Visual Studio Community 2015 Update 3 como IDE de desenvolvimento;
  • O .NET Core 1.1;
  • O ASP.NET Core 1.1.
Como primeiro passo criar um projeto do tipo ASP.NET Core Web Application (.NET Core) chamado TesteCacheMemoria:



Selecionar na sequência a opção Web Application em ASP.NET Core Templates:



Será necessário agora alterar a classe Startup, de forma a possibilitar o uso de instâncias do tipo IMemoryCache. Invocar para isto método AddMemoryCache, a partir do parâmetro services:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
 
namespace TesteCacheMemoria
{
    public class Startup
    {
        ...
 
        public void ConfigureServices(IServiceCollection services)
        {
            ...
 
            services.AddMemoryCache();
        }
 
        ...
    }
}

A classe HomeController também precisará ser ajustada:
  • O parâmetro cache da Action Index foi marcado com o atributo FromServices, de maneira que a dependência representada por IMemoryCache seja resolvida automaticamente pelo ASP.NET Core ao se invocar este método;
  • Através da referência associada ao parâmetro cache a Action Index acionará o método GetOrCreate, a fim de obter uma instância do tipo DateTime previamente vinculada ao cache da aplicação (a string TesteCache corresponde à identificação de tal referência);
  • Caso a instância do tipo DateTime ainda não tenha sido criada ou o seu prazo de permanência em cache expirou, uma nova referência será então gerada. Este último processo acontece no segundo parâmetro da operação GetOrCreate, em que são invocados a partir do objeto context as operações SetAbsoluteExpiration (responsável por definir o tempo máximo de validade de um objeto, o qual se inicia tão logo o mesmo tenha sido incluído no cache) e SetPriority (que indica a prioridade em se manter um objeto disponível durante um procedimento de limpeza do cache);
  • O objeto retornado pelo método GetOrCreate de IMemoryCache será finalmente atribuído à propriedade ViewBag, a fim de ser consumido pela View associada à Action Index.
using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Memory;
 
namespace TesteCacheMemoria.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult Index(
            [FromServices]IMemoryCache cache)
        {
            DateTime testeCache = cache.GetOrCreate<DateTime>(
                "TesteCache", context =>
                {
                    context.SetAbsoluteExpiration(TimeSpan.FromSeconds(20));
                    context.SetPriority(CacheItemPriority.High);
                    return DateTime.Now;
                });
 
            ViewBag.TesteCache = testeCache;
            return View();
        }
 
        ...
    }
}

Por fim, na próxima listagem está o trecho de código que deverá ser incluído na View Index. A ideia com isto será exibir o valor da instância armazenada em cache, com o intuito de observar por quanto tempo a mesma permanecerá ativa:

<h2>Teste de utilização da interface IMemoryCache</h2>
<h3>
    <b>Data/Hora da última atualização da View:</b>
    @DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss")
</h3>
 
<h3>
    <b>Conteúdo do objeto armazenado em cache:</b>
    @ViewBag.TesteCache.ToString("dd/MM/yyyy HH:mm:ss")
</h3>

Testes

Na próxima imagem está a tela inicial da aplicação de testes. Em vermelho encontra-se destacado o conteúdo da referência DateTime criada na Action Index, a qual foi adicionada ao mecanismo de cache (representada pela instância do tipo IMemoryCache):



Após alguns segundos um refresh na tela inicial fará com que a Action Index seja executada novamente. Contudo, a figura a seguir mostra que a instância de DateTime associada ao cache permaneceu inalterada (foi definido um tempo de expiração de 20 segundos):



Por fim, decorrido um tempo maior que 20 segundos, acontecerá uma atualização com uma nova instância sendo associada ao cache:

Conclusão

O mecanismo de cache apresentado neste artigo é mais uma das muitas mudanças que integram o ASP.NET Core. O próprio fato deste recurso estar atrelado ao uso de injeção de dependência mostra a preocupação da Microsoft em oferecer uma plataforma Web mais leve, cabendo aos desenvolvedores ativar as opções de que necessitam conforme as exigências de cada cenário (isto não acontecia em versões anteriores da plataforma ASP.NET, com inúmeros recursos ocupando porções significativas de memória durante a execução de aplicações).

Referências

ASP.NET Core 1.0 - Documentation
http://docs.asp.net/en/latest/