Como Chamar Cache Provider em Uma Linha de Código no C#

Disponível também em inglês

Nesse artigo vou compartilhar minha própria implementação de Cache Provider para usar em qualquer lugar chamando em apenas uma linha de código.

A classe de Cache Provider segue os princípios SOLID e o objetivo principal é chamar o cache através de uma linha de código.

SOLID: Fazendo uma analogia, são 5 guidelines que os desenvolvedores devem seguir para não duplicar código, usar menos dependência, dinamizar mais as funcionalidade, usar mais herança entre outras coisas. A regra básica é deixar o código mais fácil de dar manutenção e mais escalável.

Como Chamar Cache Provider em Uma Linha de Código no C#
 


 

Forma principal de usar:

var customer = _cacheProvider.CacheAsync(() => GetCustomer(id), id);

A chave usada no cache será “GetCustomer” + id.
O cache irá verificar no cache, se estiver no cache retorna do cache senão retorna do método “GetCustomer”.

Outra forma de usar:

var genders = _cacheProvider.CacheAsync(() => GetGenders());

A chave usada no cache será “GetGenders”.
O cache irá verificar no cache, se estiver no cache retorna do cache senão retorna do método “GetGenders”.

Mais um exemplo:

var userName = _cacheProvider.CacheAsync(UseCacheOrNot(), () => GetUserName(_loggedUser), _loggedUser);

A chave usada no cache será “GetUserName” + _loggedUser.
O cache irá verificar no cache somente quando o resultado do método “UseCacheOrNot” for true.
Se retornar true e existir no cache, então retorna do cache senão retorna do método “GetUserName”.

Várias formas de usar no HomeController:

HomeController constructor:

public HomeController(IAsyncCacheProvider cacheProvider)
{
    _cacheProvider = cacheProvider;
    _loggedUser = "fabio silva lima"; //sample
}

HomeController Index action:

public async Task<ActionResult> Index(string id = "0")
{
      _dateTime = DateTime.Now;

      var customer = _cacheProvider.CacheAsync(() => GetCustomer(id), id);
      var genders = _cacheProvider.CacheAsync(() => GetGenders());
      var userName = _cacheProvider.CacheAsync(UseCacheOrNot(), () => GetUserName(_loggedUser), _loggedUser);

      await Task.WhenAll(customer, genders, userName);

      var viewModel = new HomePageViewModel()
      {
           Customer = customer.Result,
           Genders = genders.Result,
           UserName = userName.Result,
           Date = _dateTime
       };

       return View(viewModel);
}

Dependency Injection:

Estou usando o Ninject para resolver o dependency injection para “IAsyncCacheProvider”, “ICacheProvider” no construtor de “HomeController” e essa configuração está em “NinjectWebCommon.cs”.

private static void RegisterServices(IKernel kernel)
{
      kernel.Bind<ICache>().To<HttpRuntimeCache>();
      kernel.Bind<ICacheProvider>().To<FslCacheProvider>();
      kernel.Bind<IAsyncCacheProvider>().To<FslCacheProvider>();
}

Observações:

A classe “FslCacheProvider” usa internamente a interface “ICache”. Isso significa que você poderá futuramente implementar a sua própria classe para essa interface. Para esse artigo, estou usando o HttpRuntime do System.Web na classe HttpRuntimeCache. “FslCacheProvider” não sabe o que ou onde os dados do Cache Provider são armazenados…

Finalmente:

  • Existem outros overloads na interface IAsyncCacheProvider e ICacheProvider.
  • O último parâmetro dos métodos do Cache Provider são um array de chaves. Isso significa que pode se passar mais de uma chave, por exemplo:
var customer = _cacheProvider.CacheAsync(() => GetCustomer(id, filter), id, filter);

No código acima a chave será “GetCustomer” + id + filter.

Bom é isso. Esperto que tenha ajudado.

Abaixo encontrará alguns links úteis.

Cache Provider em uma linha de código

Cache Provider: Perguntas, sugestões ou críticas são bem vindas. Boa sorte!

Faça download completo do código fonte no github.

Veja um demo online dessa aplicação no codefinal.
Sobre o Autor:
Trabalha como arquiteto de soluções e desenvolvedor, tem mais de 18 anos de experiência em desenvolvimento de software em diversas plataformas sendo mais de 16 anos somente para o mercado de seguros.