O X do Xamarin Forms — Utilizando EventAggregator (Sem o Prism)

Fala Galera,

tudo beleza?

Eu ja falei em algumas lives, videos e ate no meu artigo "Boas práticas e melhorias de perfomance" que eu sempre prefiro não utilizar o MessagingCenter em meus APPS.

Ai a duvida que sempre vem é, certo mas como eu resolvo se eu preciso fazer uma comunicação entre telas?

Bem se você usa o Prism para MVVM aqui esta sua solução : MVVM Em Ação — Prism Library ! EventAggregator .

Porem se você , assim como eu, tem feito apps com navegação própria (vanila, sem framework mvvm. etc etc etc) não tem esse recurso pronto.

Porem é possível implementar um EventAggregator sem o Prism.. sim, porque esse cara esta ai desde o WPF.. então só precisamos traze-lo para o Xamarin.Forms .

E o que esse padrão tem de legal? Simples, ele nos permite efetuar ações entre classes com um baixo acoplamento. Basicamente o conceito é chamar um evento e executa-lo em todos que o estão assinando ( Sim , parecido com o Message Center , porem com o seu controle ;) ).

Isso facilita muito se precisarmos enviar alguma informação, por exemplo : imagine que você possui uma tela com um carrinho de compras e quer atualiza-lo toda vez que um item for adicionado. Com um EventAggregator é possível!

Vamos ver isso na pratica!

Certo antes de mais nada é importante que você tenha familiaridade com o padrão de Singleton , caso não sugiro que leia sobre o mesmo aqui.

Criando nosso EventAggregator

Para facilitar meu exemplo, vou utilizar o pacote MVVM.Helpers do James montemagno , assim ja teremos todas as ferramentas para as ViewModels.

Em seguida vamos criar uma interface IEventAggregator (Lembre-se que é sempre bom trabalhar com interfaces, o SOLID manda um abraço) :

Perfeito, agora vamos implementar nossa interface :

Pronto!

Agora eu explico, basicamente nós criamos métodos que possam ser assinados e receber envios não importa de onde em nossa Thread.

E Claro , não se esqueça : Se você assina um evento, é bom remove-lo quando não for utilizar mais. Eventos assinados e não utilizados podem ocasionar problemas de perfomance.

Lembram o que eu falei do Singleton Patter acima? Então vamos implementa-lo na classe EventAggregator :

Agora com isso poderemos utilizar a classe em todo nosso APP assinando e chamando eventos.

Agora vamos criar um Objeto que será nossa "Mensagem", eu gosto de usar objetos caso precisemos de mais de uma informação :

Muito bem ! Vamos utilizar !

Vamos criar 2 Views bem simples :

A ideia é fazer uma soma na segunda View e o mesmo resultado aparecer de forma "Magica" na primeira.

Para isso vamos Implementar as ViewModels :

Notem que na primeira tela estamos assinando o Evento com EventAggregator.Instance.RegisterHandler<SomarMessage>(
SomarHandler);
Ou seja não importa quem chamar, sempre que o SomarMessage for chamado nessa pagina o SomarHandler executara.

Em seguida vamos implementar a SegundaView :

Agora na segunda ViewModel vamos chamar o EventAggregator.Instance.SendMessage(SomarMessage); E enviar nossa mensagem, ou seja todos que estiverem "Escutando" vão recebe-la.

Basicamente o que acabamos de fazer é, eu vou apertar um botão e ficar somando de 1 em 1, a informação será exibida na tela. Se seguida eu envio a informação a todos que assinaram aquele evento ( A tela anterior) e de forma automática ela é atualizada também :

Muito simples e legal né? Bem ja que estamos falando de Patterns e boas praticas.. vamos fazer uso da nossa Interface IEventAggregator e implementar um injetor de dependencia , para fazer isso basta seguir os passos do meu repositorio : XamarinFormsMSExtensions .

Importante , na hora de configurar o EventAggregator vamos injeta-lo como Singleton :

Pronto, agora temos um app com total baixo acoplamento :)

É um exemplo simples, mas creio que ajude. Eu aconselho que se não estiver acostumado com SOLID, Singleton e padrões dar uma lida sobre, pois são muito importantes ;) .

Se quiser pode baixar o exemplo clicando aqui.

Quer ver outros artigos sobre Xamarin ? Clique aqui.

Espero ter ajudado!

Aquele abraço!

Microsoft MVP,Gamer, Desenvolvedor e apaixonado por tecnologia!

Microsoft MVP,Gamer, Desenvolvedor e apaixonado por tecnologia!