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