.NET

17 nov, 2010

MVP & ASP.NET – Serviço de mensagens

Publicidade

No artigo MVP & ASP.NET  – Introdução ao Passive View, tivemos uma breve inserção ao padrão de projetos de software MVP. Continuaremos na mesma abordagem, mas dessa vez iremos acrescentar à solução um serviço responsável por fazer interação das mensagens geradas pelo sistema com a UI (User Interface).

Esse serviço englobará as mensagens customizadas implementadas em alguma regra de negócio específica ou então a formatação de mensagens geradas por exceptions.

Devemos ter em mente que não podemos quebrar com o paradigma do padrão, ou seja, não importa de que forma você exibirá as mensagens para o usuário, devemos manter a abstração do apresentador para que possamos utilizar o mesmo serviço em outras UI, e o mesmo serviço poderá ser utilizado em aplicações WPF, Windows Forms ou Silverlight.

Implementação

O serviço que será esboçado no artigo terá dois comportamentos: o primeiro será idêntico ao de um exception para que possamos fazer com que os exceptions gerados pela MODEL sejam “jogados” até o apresentador da aplicação.

O segundo comportamento é responsável por exibir mensagens customizadas que estarão implementadas dentro da nossa regra de negócio e dentro do apresentador.

Iremos adicionar à solução um projeto chamado Service que comportará os serviços comuns às entidades do MVP, ou seja, ele estará presente em MODEL, VIEW E PRESENTER. Acompanhe na imagem abaixo a nova estrutura da aplicação:

O serviço de mensagens é composto por uma interface chamada ICustomMessage e por uma classe chamadaCustomMessage. A seguir, um descritivo de suas responsabilidades:

  • ICustomMessage é a responsável por manter a abstração do apresentador e por tornar o serviço de mensagens testável e reutilizável.
  • CustomMessage tem como objetivo armazenar as regras responsáveis pelo tratamento dos exceptions geradas pela aplicação, como por exemplo, exibir uma mensagem gerada pelo framework e a converter em uma mensagem mais amigável para o usuário. Essa classe herda de um exception, possibilitando que o serviço possa percorrer as entidades até chegar ao apresentador através da utilização do throw, assumindo o mesmo comportamento de um exception.

Abaixo, um esboço do serviço sendo requisitado através da BL, a imagem traz uma breve explicação da finalidade de cada implementação. Gerar exceptions pode se tornar muito custoso.

Essa foi uma maneira simples que encontrei para tratar as mensagens geradas no modelo da aplicação sem quebrar no paradigma do padrão de projeto MVP. Como já sabemos, o modelo não deve interferir nas regras de apresentação, mantendo o Presenter como responsável por controlar as mensagens exibidas ao usuário.

No apresentador, devemos adicionar uma interface que comportará as funcionalidades comuns a todas as interfaces daPresenter. Ela implementa a propriedade Message do tipo ICustomMessage, que tem como objetivo abstrair o serviço de mensagens. Acompanhe a estrutura da interface IGeneric:

Na entidade Presenter é que tratamos as regras de apresentação para que as mensagens sejam exibidas ao usuário através de User Interface. Essas mensagens podem ser dos mais variados tipos como: DivideByZeroException,ArithmeticException, SystemException, SqlException ou até mesmo a nossa CustomMessage.

A utilização do throwpermite que esses exceptions naveguem entre as entidades chegando até o apresentador. O exemplo abaixo pode esclarecer o funcionamento:

Já tivemos um prévia do comportamento da CustomMessage e em quais casos ela pode ser aplicada, agora vamos pensar em como exibir essas mensagens para o usuário através de um WebForm.

Um projeto chamadoMVP.Web.Controls deve ser adicionado à solução. Esse projeto tem a responsabilidade de tratar o controle responsável pela parte “visual” do serviço de mensagens quando estamos trabalhando com WebForms.

O projeto MVP.Web.Controls será composto por uma única classe chamada SystemMessage. Ela implementa a interface ICustomMessage, logo devemos escrever os métodos Show e Hide, responsáveis por exibir e fechar a mensagem gerada pelo sistema.

Você pode observar que o estilo das mensagens também é tratado na SystemMessage, e, de uma forma simplória, definimos a formatação da mensagem conforme o tipo de mensagem acionada.

Já no Code-Behind do WebForm, basta você implementar o atributo Message da interface ICustomMessage, para que a Presenter decida quando exibir ou quando fechar a mensagem. No meu caso, preferi centralizar um Panel namaster.Page, para não ter que reproduzir o controle em todos os Formulários.

Você pode acompanhar o resultado final do serviço de mensagens na versão Web, para cada tipo ExceptionType existe um estilo diferente de apresentação.

Conclusão

Essa é apenas uma maneira de controlar as mensagens do seu sistema sem quebrar os conceitos do padrão de projetos de software MVP. É uma alternativa simples, porém você deve tomar muito cuidado quando for utilizar o recurso para gerar exceptions: isso não é aconselhável porque pode atrapalhar o desempenho da sua aplicação.

No código-fonte você pode encontrar exemplos da CustomMessage utilizando WPF e Windows Forms.

Obrigado a todos!

Referências:

Requisitos:

  • Visual Studio 2008 SP1
  • Framework 3.5 SP1

Segue o código-fonte para download.