Cache Provider em uma linha de código

Posted on Posted in C#, Design Patterns

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.

Forma principal de usar:

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

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

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

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

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

A chave usada no cache será “GetUserName” + _loggedUser. O cache provider 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”.

Quer sugerir outro tema ou artigo para esse Blog?

[contact-form-7 404 "Not Found"]

Continuando…

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 são armazenados…

Finalmente:

– Existem outros overloads na interface IAsyncCacheProvider e ICacheProvider.
– O último parâmetro dos métodos do cache 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.

Boa sorte!

Perguntas, sugestões ou críticas são bem vindas.

Check the english version:
Cache Provider in one line of code

Faça download completo do código fonte:
github – FSL.CacheProvider

Online demo:
codefinal – FSL.CacheProvider

Leave a Reply

Your email address will not be published. Required fields are marked *