O X do Xamarin Forms —Everybody say about Polly

Thiago Bertuzzi
Sep 26 · 4 min read

Everybody say about bir.. Polly!! Surfing Birds!!!

don’t you know, about the Polly?
Well, everybody knows that the Polly is the word!

Fala galera,

Tudo beleza?

Resiliência segundo o dicionário :

Propriedade que alguns corpos apresentam de retornar à forma original após terem sido submetidos a uma deformação elástica.

Levando para o nosso mundo, imagine que você tem uma API Rest e precisa fazer varias chamadas. Se ocorrer algum erro, timeout e etc.. o que você faz?

Eu cheguei a escrever um artigo chamado Xamarin Rocket #5 — Notificação ao alterar a conexão , para você conseguir identificar quando a conexão mudou e efetuar uma ação.. Mas e se eu quiser ir alem?

E se de alguma forma essa chamada pudesse voltar ao estado original e tentar novamente ? Ou seja, caso algum erro aconteça ela tenha a capacidade de se recuperar e tentar novamente… isso não é uma forma de resiliência?

Tratar quantas vezes eu vou tentar a chamada de uma API, ou se a cada tipo de erro diferente eu efetuar uma ação customizada , pode melhorar e muito a usabilidade e a experiencia de seu app.

É ai que entra nosso querido Polly ! Um framework poderoso que vai nos ajudar nessa tarefa !

Existem formas de utilizar o Polly com Asp.net por exemplo, inclusive recomendo este incrível artigo do meu amigo MVP Renato Groffe : .NET Core + Polly + JWT: tratando de forma resiliente a expiração de tokens, mas hoje vamos ver como utiliza-lo com Xamarin :D !

A-well-a Polly, Polly, P-Polly’s the Polly…. Configurando o Polly !

Vamos ao Nuget instalar o Pacote Polly em nosso projeto compartilhado :

Simples e sem mais configurações :).

Pa pa oom mow m-mow ,Oom m-oom m-oom m-oom … Utilizando o Polly!

A vantagem do Polly é que ele tem diversas implementações para Resiliência, assim como diz em sua documentação :

· Retry : Podemos configurar para o Polly tentar varias vezes uma chamada a api.

· Circuit-breaker : Quando determinadas quantidade de falhas ocorrer, o circuito é interrompido, por um determinado periodo.

· Timeout : Sim, podemos adicionar um tempo limite para uma requisição.

· Bulkhead Isolation : Podemos restringir uma falha e ate isola-la sem comprometer todo o APP. Ou seja, caso aconteça algum problema o mesmo não vai afetar outras funcionalidades.

· Cache: Como o nome diz, podemos guardar o resultado de uma requisição.

· Fallback : É possível configurar outros valores de retorno , caso aconteça alguma falha.

· PolicyWrap : Podemos configurar diversas das politicas citadas acima de forma eficiente.

Certo agora que você ja sabe seus novos poderes (abraço tio ben), vamos ver como utilizar alguns :

Vamos criar um aplicativo simples :

Uma Model :

Uma Base ViewModel e Nossa ViewModel :

Nossa View que ira exibir a tela dos pokémons :

E as estrelas desse artigo a IPokemonService e a PokemonService.

Pronto , Temos um app funcional mas não resiliente.

Para facilitar usei como base meu projeto de exibir pokémons do repositório PersistindoDados (não se preocupe no final do artigo vai ter todo o fonte) .

A mudança que eu quero fazer é na classe PokemonService, na hora de obter os dados eu quero inserir uma politica de Retry :

Notem que eu adicionei uma politica de Retry e um Handle. Calma, calma , eu explico .

Com o Polly nos agrupamos nossa chamada em uma politica.

Com o método Handle, você pode especificar quais tipos de exceções precisam ser tratados. Por exemplo, no código acima HttpRequestExceptions é executado novamente, mas somente quando não é um erro 404.

Inclusive no onRetry você pode fazer alguma ação customizada, no meu caso só estou exibindo o erro no console.

Em seguida adiciono quantas tentativas queremos fazer e o tempo q devemos esperar entre elas.

Mas lembre-se após acabarem as tentativas , nesse caso, a exceção será lançada normalmente como se não existisse o Polly.

Para testar basta desligar a Wifi do dispositivo, ele vai tentar 3 vezes.

Se eu quiser apenas utilizar um Timeout, por exemplo, a implementação é parecida:

Utilizando a Politica como uma variável, basta determinar o tempo que você quer esperar a requisição e executa-la.

Existem diversos tipos de Timeouts que podem ser configurados e você pode verificar na documentação oficial clicando aqui.

Existem exemplos das outras funções do Polly na documentação

Inclusive existe uma live do Canal .NET em que o MVP angelobelchior demonstrou o uso de Polly em aplicações .NET.

Uma ultima coisa

Aqui eu quero deixar uma dica caso você tenha diversos serviços de API's e não quiser ficar implementando diversas vezes o mesmo código.

Nós podemos criar uma interface para simplificar o uso do Polly dentro de nossas Api's.

Vou usar como base o projeto polly-mvvm e criar a interface :

Em seguida vamos implementar a interface :

Pronto ! Agora com uma linha eu posso passar um método para a chamada rest, timeout e um método para tratar quando o Retry for efetuado :

Assim podemos implementar em todas as nossas Apis :)

Não entendeu as piadas desse artigo? Clique aqui.

Caso queira baixar o código utilizado no Exemplo: Clique aqui.

Quer ver outros artigos sobre Xamarin ? Clique aqui.

Espero ter ajudado!

Aquele abraço!

Thiago Bertuzzi

Written by

Microsoft MVP,Gamer, Desenvolvedor e apaixonado por tecnologia!

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade