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 (normalmente em memória) para possibilitar um processamento mais rápido de requisições.

Desde 2014 a Microsoft vem trabalhando no ASP.NET 5, uma iniciativa que visa a reformulação completa de sua plataforma de desenvolvimento Web. Como não fica difícil de se imaginar, esta versão do ASP.NET também conta com um novo mecanismo para cache em aplicações voltadas à Internet. A manipulação de objetos em memória depende agora de implementações da interface IMemoryCache (namespace Microsoft.Framework.Caching.Memory), sendo que este artigo tem por objetivo demonstrar na prática como tal recurso pode ser empregado em um projeto MVC 6.

Exemplo de utilização em uma aplicação MVC 6

Para demonstrar o novo mecanismo de cache que integra o ASP.NET 5 será criada uma solução que faz uso dos seguintes recursos:

  • O Microsoft Visual Studio 2015 Release Candidate como IDE de desenvolvimento;
  • O .NET Framework 4.6;
  • O framework ASP.NET 5 para a criação de uma aplicação MVC 6;
  • O package Microsoft.AspNet.Session.

Um projeto do tipo “ASP.NET Web Aplication” será gerado, tendo por nome “TesteCacheASPNET5” (Imagem 1). Ao se confirmar este primeiro passo, selecionar na sequência em “ASP.NET 5 Preview Templates” a opção “Web Site” (Imagem 2).

cache01
Imagem 1: Criando uma ASP.NET Web Application no Visual Studio 2015

cache02
Imagem 2: Selecionando o template Web Site no Visual Studio 2015

O package Microsoft.AspNet.Session será referenciado na aplicação de testes, a fim de tornar possível o uso das funcionalidades de cache disponibilizadas pelo ASP.NET 5. Este procedimento deve ser efetuado através do utilitário NuGet, o qual pode ser acessado com o botão direito do mouse sobre o item References do projeto (Imagem 3).

cache03
Imagem 3: Adicionando uma dependência ao projeto via NuGet

Na interface da ferramenta NuGet pesquisar por “session”. Selecionar o projeto Microsoft.AspNet.Session (Imagem 4), prosseguindo com a instalação do mesmo. Ao término destes passos, será possível constatar que a referência foi devidamente incluída na aplicação de testes (Imagem 5).

cache04
Imagem 4: Pesquisa de packages a partir do utilitário NuGet

cache05
Imagem 5: Referência incluída a partir do NuGet na aplicação de testes

Será necessário agora alterar a classe Startup (uma espécie de substituto do antigo Global.asax), de forma a possibilitar o uso de instâncias do tipo IMemoryCache (Listagem 1):

  • O método ConfigureServices recebe como parâmetro uma referência do tipo IServiceCollection (namespace Microsoft.Framework.DependencyInjection), a qual será utilizada no mapeamento de dependências entre tipos básicos (como interfaces) e as implementações concretas correspondentes;
  • No caso específico do exemplo deste artigo, a operação ConfigureServices será ajustada, de maneira que o projeto MVC consiga mapear (via injeção de dependência) todas as ocorrências de IMemoryCache para a implementação concreta representada pela classe MemoryCache (namespace Microsoft.Framework.Caching.Memory). A invocação do método AddSingleton fará com que uma única de instância de IMemoryCache seja utilizada na resolução de todas as dependências encontradas ao longo da aplicação, constituindo-se em um exemplo prático de uso do pattern Singleton;
  • Por fim, a chamada à operação AddCaching fará com que o mecanismo de cache seja habilitado para uso no projeto de testes.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Diagnostics;
using Microsoft.AspNet.Hosting;
using Microsoft.AspNet.Http;
using Microsoft.AspNet.Routing;
using Microsoft.Framework.ConfigurationModel;
using Microsoft.Framework.DependencyInjection;
using Microsoft.Framework.Logging;
using Microsoft.Framework.Logging.Console;
using Microsoft.Framework.Caching.Memory;

namespace TesteCacheASPNET5
{
    public class Startup
    {
        ...

        public void ConfigureServices(IServiceCollection services)
        {
            ...

            services.AddSingleton<IMemoryCache, MemoryCache>();
            services.AddCaching();
        }

        ...
    }
}

A classe HomeController também precisará ser ajustada, sendo que na Listagem 2 está o código esperado para essa estrutura:

  • Este Controller conta com uma propriedade chamada “Cache”, à qual será atribuída uma instância do tipo IMemoryCache por meio do mecanismo de injeção de dependências do ASP.NET 5. Para que isto aconteça a propriedade Cache foi marcada com o atributo FromServicesAttribute (namespace Microsoft.AspNet.Mvc);
  • A Action Index faz uso da propriedade Cache, realizando uma chamada ao método GetOrSet para obter uma instância do tipo DateTime previamente vinculada ao cache (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 GetOrSet, 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 GetOrSet de IMemoryCache será finalmente atribuído à propriedade ViewBag, a fim de ser consumido pela View associada à Action Index.
using System;
using Microsoft.AspNet.Mvc;
using Microsoft.Framework.Caching.Memory;

namespace TesteCacheASPNET5.Controllers
{
    public class HomeController : Controller
    {
        [FromServices]
        public IMemoryCache Cache { get; set; }

        public IActionResult Index()
        {
            DateTime testeCache = Cache.GetOrSet("TesteCache", context =>
            {
                context.SetAbsoluteExpiration(TimeSpan.FromMinutes(2));
                context.SetPriority(CachePreservationPriority.High);
                return DateTime.Now;
            });

            ViewBag.TesteCache = testeCache;

            return View();
        }

        ...
    }
}

Já na Listagem 3 está um 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 o tempo em que a mesma permanecerá ativa.

...

<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>

Teste da aplicação criada

Na Imagem 6 está a tela inicial da aplicação TesteCacheASPNET5. Em vermelho encontra-se destacado o conteúdo da referência DateTime criada na Action Index, a qual foi adicionada ao mecanismo de cache do ASP.NET 5 (representada pela instância do tipo IMemoryCache).

cache06
Imagem 6: Tela inicial da aplicação TesteCacheVS2015

Após pouco mais de 1 minuto um refresh na tela inicial fará com que a Action Index seja executada novamente. Contudo, a Imagem 7 mostra que a instância de DateTime associada ao cache permaneceu inalterada (já que se definiu um tempo de expiração de 2 minutos).

cache07
Figura 7: Novo refresh, com a instância associada ao cache inalterada

Por fim, decorrido um tempo maior que 2 minutos, acontecerá uma atualização com uma nova instância sendo associada ao cache (como mostrado na Imagem 8).

cache08
Figura 8: Novo refresh, com atualização da instância associada ao cache

Conclusão

O novo mecanismo de cache apresentado neste artigo é mais uma das muitas mudanças que integram o ASP.NET 5. 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).

Espero que este conteúdo possa ter sido útil.

Até uma próxima oportunidade!

Referências

ASP.NET 5 Documentation
http://docs.asp.net/en/latest/

Visual Studio 2015: Implementando uma aplicação ASP.NET MVC 6
http://www.devmedia.com.br/visual-studio-2015-implementando-uma-aplicacao-asp-net-mvc-6/32265

Renato Groffe

Atua como consultor em atividades voltadas ao desenvolvimento de softwares há mais de 13 anos. Bacharel em Sistemas de Informação, com especialização em Engenharia de Software. Microsoft Certified Technology Specialist (Web, WCF, Distributed Applications, ADO.NET, Windows Forms), Microsoft Specialist (HTML5 with JavaScript and CSS3, Developing ASP.NET MVC 4 Web Applications), Oracle Certified Associate (PL/SQL), Sun Certified (SCJP, SCWCD), ITIL Foundation V2, Cobit 4.1 Foundation.

Facebook Google+ 

Comentários

comentarios