Notifique suas regras de negócio com Marraia.Notifications

Fernando Mendes
JunDevelopers
Published in
4 min readJul 21, 2020

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!

--

--

Fernando Mendes
JunDevelopers

Software Architect .NET C# | Microsoft MVP 🏆🏆 | Co-Founder community JunDevelopers