Notificações ao invés de exceções .NET Core

03

Olá, galera!

Ao longo de muito tempo desenvolvendo, vi que para tratar condições de regras de negócios, criamos exceções. Eu mesmo já usei essa estratégia. Ela pode ser mais fácil, mas isso é totalmente prejudicial ao servidor, pois cada exceção é logada no EventViewer como se fosse algo anormal da aplicação.

Precisamos entender que exceções precisam, sim, ser tratadas. Mas como o próprio nome diz: exceções. Regras de negócio de sua aplicação são condições que a aplicação espera que possa acontecer, e por isso não são exceções.

Exemplos de exceções: conexão com o banco de dados não encontrada, conversão de dados errada, objeto não encontrado, etc.

“Um objeto que coleta informações sobre erros e outras informações na camada de domínio e as comunica à apresentação” – Martin Fowler

Para tratar as condições de regras de negócios como notificações, vou explicar uma das funcionalidades da biblioteca MediatR, que utilizamos muito com o pattern CQRS, mas podemos usar parte do pattern para utilizar as notificações.

Vamos lá!

Vamos criar uma WebApi em .NET Core

Criação de API

Para melhorar o nosso entendimento, vamos criar uma camada “Application” para criarmos algumas regras que serão notificadas; uma camada de “Domain” para classes de domínio e uma camada “Common” com classes comuns para a lógica das notificações.

Criando as camadas

Agora vamos instalar o pacote do MediatR nos projetos API e Common.

PM> install-package MediatR

E também instalar o pacote de injeção de dependências do MediatRno projeto da API.

PM> install-package MediatR.Extensions.Microsoft.DependencyInjection

Na camada Common vamos incluir a seguinte estrutura de pastas e classes:

Estrutura de classes

A classe Notifications.cs herdará a interface INotification que marca a classe que será de notificação, e terá as propriedades Key e Value,que vamos utilizar para dizer qual é o tipo da mensagem, e a própria mensagem.

Classe de notificação

Classe NotifiyHandler.cs, que será a classe que processará as mensagens de acordo com a interface INotificationHandler, que implementa a classe Notifications.cs.

Classe de controle das notificações

E a classe Notify.cs que será a classe que irá gerar as mensagens. Quando invocada, executa o handler de notificação implementada na classe NotifiyHandler.cs.

Classe de criação de notificações

Depois injete as dependências das classes que criamos em Startup.cs no projeto da API, conforme abaixo:

Injetando as classes de notificação

Tendo configurado essas classes, vamos criar uma regra de um POST da API na camada de “Application”. Notificaremos quando o aluno for menor de 18 anos. Na camada “Application”, crie a classe StudentAppService.cs com um método que valida a idade.

Método que valida o aluno e notifica caso a condição seja verdadeira

Depois, criamos na API um BaseController com métodos de verificação se existe notificação para ser exibida ao usuário na requisição do POST.

Classe de verificação se existe notificação a ser exibida ao usuário

Em seguida, crio a controller StudentController.cs, com a chamada do método de validação do aluno.

Controller de Student

Veja no exemplo que no método POST, que executa o método CreatedHasNotification, que está na classe BaseController.cs, onde verifica se existe notificações ou não. Caso não tenha notificações, retorna o código 201(Created), caso contrário, retorna 404(BadRequest) com a(s) notificação(ões).

Chamada da API pelo postman

Quando executado a API:

Código de retorno

Notificação ao usuário

Veja que é simples usar notificações, e tenha certeza que usando esse pattern, você estará implementando boas práticas, que serão de total benefício ao seu projeto.

Como disse no início deste artigo, use exceções quando realmente for necessário e não para regras de negócio; isso é um anti-pattern.

Espero que tenham gostado. Até a próxima!

Segue o exemplo em meu GitHub:

https://github.com/marraia/ExemploNotificacao

0 Gestei
0 Não gostei

Deixar uma resposta

Seu endereço de email não será publicado. Campos obrigatórios marcados com *