Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Modelo Infra

Bom dia! Minha dúvida não seria com relação a código em específico mas sim com relação a arquitetura da aplicação.

Bem, estou fazendo o curso aplicando DDD e dividindo a aplicação em camadas. 1 .Aplicação -> 2.Serviços -> 3.Domínio <- 4.Infra

Minha camada de Domínio esta isolada e não referencia outras camadas, sendo assim tenho minha Aplicação chama a camada de Serviço que chama o Serviço de Domínio que por fim comunica com o repositório na camada de Infra.

Estou implementando as validações do meu domínio porém me surgiu uma dúvida de onde executar as validações antes de chamar o repositório. Devo realizar as validações no meu Serviço de Domínio, ou na minha camada de Serviços?

Pensei em colocar nos Serviços de Domínio pois assim eu posso estar utilizando meu domínio completo externamente em caso de reutilização, porém a camada de Serviço ficaria "pobre" até o momento, tendo apenas chamadas para a camada abaixo(Dominio).

Qual seria uma melhor abordagem para chamar as validações, nos Serviços de Domínio, ou na camada de Serviços? Também pensei em remover a camada de Serviços e chamar os Serviços de Domínio direto da camada de Aplicação.

1 resposta
solução!

Fala, Murilo, para realizar validações costumo aplicar um princípio chamado Fail Fast. Objetivo é diminuir ao máximo o tempo de feedback para o usuário do sistema.

Então pergunto: qual camada está mais perto do usuário? A camada de aplicação, certo? Então é lá que você irá aplicar a primeira parte da validação. Em geral, campos obrigatórios, tamanhos mínimos e máximos, datas, números e códigos inválidos, etc. É nessa camada onde vivem os controladores. Por isso devemos usar e abusar do ModelState, lembra?

Já validações para regras de negócios mais caras e críticas ficam na camada de serviços. São elas que irão depender de outros serviços, até mesmo outros módulos e sistemas.

Depois que tudo for validado pelas camadas superiores executamos o necessário para implementar aquele determinado caso de uso, seja persistir no banco, seja enviar email ou processar uma operação.

Depois, pra refletir mais um pouco sobre arquitetura de uma aplicação, dá uma lida nesse conceito do Uncle Bob.

Espero ter ajudado. Abraços!