Introdução
No artigo de hoje vamos estruturar uma web API .Net Core 2.2, separando em API, Domain, Repository e Services, utilizando o conceito de interfaces e clean code.
Mão na Massa
Vamos criar um novo projeto web no Visual Studio
![](https://miro.medium.com/max/700/1*UM2A9dJW9oZoqoQZAy4A6Q.png)
Selecione API e utilize o Core 2.2
Após a criação, vamos ter essa estrutura no projeto:
O objetivo é criar outros projetos dentro da nossa solução e deixar cada um com sua respectiva responsabilidade.
Vamos criar os projetos:
- Api: Irá conter as chamadas das nossas APIs.
- Domain: Irá conter as entidades do nosso sistema (Dominios Ricos).
- Repository: Onde será realizado as interações de persistência.
- Service: Onde será realizado a regra de negócio em caso necessário.
Cada classe criada dentro da service e repository terá seu respectivo contrato (Interfaces).
Criando os projetos:
Clique com o botão direito em cima da Solution e crie um novo projeto.
Em seguida, selecione o projeto Biblioteca de Classes (Class Libary) e adicione o nome do projeto, lembrando que vamos criar uma class libary para cada projeto mencionado.
No final, teremos essa estrutura:
Agora que nossos projetos estruturados já estão estruturados, vamos criar um controller chamado HeroContolle e um endpoint do tipo Post chamado HeroApi.
Esse endpoint irá receber alguns parâmetros, mas em vez de adicionar N parâmetros no escopo do método, vamos criar uma classe chamada HeroDto, um padrão de projeto para transferencial de dados entre camadas.
![](https://miro.medium.com/max/700/1*4Zs7EtnpRd_hLXwpBqgo-A.png)
Agora que já temos nossa DTO, vamos criar nossa Model dentro do projeto Domain chamada Hero.
![](https://miro.medium.com/max/700/1*jvkNTaqKQtrSx_MJkfQgNA.png)
Note que em nossa classe tem um construtor, e o atributos dela são privados ou seja, um Hero só é criado dentro da classe Hero. Dessa forma, evito que meu objeto seja alterado no decorrer do processo.
Agora que já temos nossa model, vamos criar nossa classe service com o nome HeroService.
Note que vamos utilizar nesse momento o conceito de contratos (Interfaces). Basicamente, a service irá ter contratos para ser acessada, ou seja, nossa controller não conhece a HeroService. Ela conhece o contrato da classe. Se por algum motivo a classe HeroService for alterada, as camadas acima não são impactadas.
Vamos criar a interface IHeroServices, que contém apenas a assinatura do método, ou seja, a controler sabe que tem que chamar um IHeroService.Hero. Ela não sabe, porem, quem implementa essa interface. Dessa forma, começamos a isolar os pontos do sistema:
![](https://miro.medium.com/max/700/1*_-Qp9vVu_2TNLCOV8xEcUQ.png)
Agora vamos herdar nossa interface na classe heroService.
![](https://miro.medium.com/max/700/1*9f3VLtS4avyCNO8Am82D0g.png)
Dentro da services vamos adicionar a regra de negócio. Se o nome do hero for “Iron Man”, vamos adicionar uma lista de string, apenas para simular uma regra de negócio em nossa service.
![](https://miro.medium.com/max/700/1*gtSsFohTkIQGCovfYk8aKA.png)
Agora devemos criar a HeroRepository e ajustar a HeroService, utilizando o mesmos conceitos de interfaces.
Na repository não vamos nos aprofundar. Vou retornar apenas o hero. Nos próximos artigos, vamos utilizar o Dapper para realizar a persistência de dados.
Vamos voltar a HeroService e utilizar a IHeroRepository:
![](https://miro.medium.com/max/700/1*EG5uxM8GoNVQ4aopJArm4w.png)
Note que criamos uma propriedade readOnly do tipo IHeroRepository e passamos ela para o construtor da classe, funcionando através da injeção de dependência do .Net Core.
Vamos fazer a mesma coisa na controller, só que agora vamos adicionar a service.
![](https://miro.medium.com/max/700/1*bjYGUtaYX67KEf4s6_RIpw.png)
Por fim, para dar certo tudo que desenvolvemos até aqui, precisamos mapear na injeção de dependência do .net core para as interfaces criadas.
Vamos até a classe startup no método ConfigureServices para adicionar os Singletons:
![](https://miro.medium.com/max/590/1*Fv-lopcnZ4uMmu8pYfDrig.png)
Referencias do projeto:
Api: Referência — Service
Service: Referência — Domain e Repository
Repository: Referência — Domain
Domain: Não referencia Ninguém
Estrutura Final
![](https://miro.medium.com/max/449/1*Rv8MRZErEOVy9-wjRVePRA.png)
Testes
Vamos ver se isso tudo deu certo. Abra o postman e execute o projeto:
![](https://miro.medium.com/max/700/1*McA-74LOhyIeHaEL9NgSLQ.png)
O código está no meu GitHub. Confere lá.