Notifique suas regras de negócio com Marraia.Notifications
Olá Pessoal, tudo bem?
Ontem dia 20/07, realizei uma live no canal JunDevelopers, abordando o tema Evitando exceções em regras de negócio. Use notificações!!
Como o próprio tema diz, o aconselhável em nossos projetos, é que coloquemos exceções onde realmente precisa-se ser exceções e tratar as regras de negócio como notificações.
Por esse propósito criei um pacote no Nuget, para auxiliar em minhas API´s e também para quem quiser, criar notificações ao invés de usar exceções.
Vou mostrar aqui de forma simples, como usar as notificações com o pacote Marraia.Notifications.
Vou criar um projeto de API pelo Visual Studio
Depois de criar a estrutura da API, vamos agora adicionar o pacote via Nuget Marraia.Notifications, nos projetos ExemploNotifications.API e ExemploNotifications.Domain.
PM > Install-Package Marraia.Notifications
Agora precisamos injetar o uso da biblioteca no projeto.
Vá na classe Startup.cs e adicione middleware específico da biblioteca:
public void ConfigureServices(IServiceCollection services)
{
..
..
services.AddSmartNotification();
}
Em suas regras de negócio ao invés de usar exceptions para saber se alguma regra foi violada, notifique suas mensagens. Em nosso caso em API´s, você poderá especificar se as suas regras são de uma má requisição(Bad Request (400)) ou se alguma regra foi violada(Conflict (409))
Em nossa classe StudentDomainService, vamos injetar a interface ISmartNotification, para a utilização das notificações;
private readonly ISmartNotification _notification;
public StudentDomainService(ISmartNotification notification)
{
_notification = notification;
}
Para essa classe, temos o método Insert(), onde vamos validar se o estudante é maior de idade. Caso essa regra não for verdade, vamos notificar, dizendo que o estudante que estamos tentando cadastrar é menor de idade.
Como pode ser uma violação de regra de negócio, vamos tratar com o código HTTP 409(Conflict), representado com o método NewNotificationConflict().
Depois de notificar suas regras de negócio, em sua controller utilize os métodos:
-OkOrNotFound() => Para métodos GET, se verifica caso tenha algum item, o método retornará o código HTTP Ok(200).
Caso não ter nenhum item, retornará o código HTTP NotFound(404)
-OkOrNoContent() => Para métodos GET, se verifica caso tenha alguma lista com itens, o método retornará o código HTTP Ok(200).
Caso não ter nenhum item na lista, retornará o código HTTP NoContent(204)
-AcceptedContent() => Para método PUT, caso a alteração foi com sucesso, retornará Accept(202).
Caso o recurso não foi encontrado, retornará NotFound(404). Caso tenha notificação retornará as notificações específicas BadRequest(404) ou Conflict(409)
-CreatedContent() => Para método POST, caso a inserção foi com sucesso, retornará Created(201).
Caso tenha notificação retornará as notificações específicas BadRequest(404) ou Conflict(409)
Faça a herança da classe BaseController em sua controller, e faça a injeção da interface INotificationHandler no construtor.
Agora vamos fazer a execução da API, e fazer a aplicação notificar a violação da regra.
Com a propriedade Age com valor 0, a regra irá ser violada. Com isso depois da execução, a mensagem de retorno será:
Percebam que a API retornou, o código HTTP 409, dizendo que é um conflito. E no Json de retorno, a mensagem que colocamos no código, dizendo que o estudante é menor de idade.
Podemos também fazer validações das propriedades na requisição, e retornar o código 400(BadRequest), dizendo que os campos são obrigatórios.
Vejam que posso ir adicionando notificações, e posso validar se tenho notificações para serem retornadas.
Executando a API, sem informar os dados obrigatórios
O retorno será desta forma:
O retorno será de código 400(BadRequest), pois os campos obrigatórios não foram informados.
Vejam que a propriedade message, é um array, onde posso colocar quantas notificações forem necessárias.
Espero que tenham gostado desse artigo, e que possam ao invés de usar exceções, começarem a usar notificações. Exceções temos que usar sim, mas quando realmente for uma exceção, algo que a sua aplicação não espera que aconteça.
Exemplo em meu github:
Até a próxima!