ASP .NET Core - Implementando Clean Architecture - II

Hoje vamos iniciar a implementação da Clean Architecture em uma aplicação ASP .NET Core MVC.

Continuando o artigo anterior hoje vamos iniciar a definição do padrão Repository no projeto Shop.Application.

A definição formal do padrão Repository é a seguinte:

'O padrão Repository medeia entre o domínio e as camadas de mapeamento de dados usando uma interface semelhante a uma coleção para acessar os objetos do domínio.'

Podemos dizer que o padrão Repositório atua como um intermediário ou uma camada intermediária entre o restante do aplicativo e a lógica de acesso aos dados.

Vamos iniciar a implementação criando uma pasta Interfaces no projeto Shop.Domain:

Nesta pasta Interfaces crie o arquivo IProductRepository.cs e inclua o código a seguir:

Muito bem, neste ponto, se o projeto MVC ou a camada de apresentação (que não conhece nada sobre a entidade de domínio Product) solicitar uma lista de produtos, ela vai precisar pedir isso a um serviço que iremos implementar a seguir e que chamaremos de ProductService e que vai usar a interface IProductService.

Agora de onde ProductService vai obter os dados ?

Este serviço vai obter os dados a partir de ProductRepository que é o repositório que iremos implementar a partir de IProductRepository.

Então vamos criar primeiro o serviço ProductService na pasta Services do projeto Shop.Application.

Crie a classe ProductService e inclua o código abaixo:

Observe que estamos injetando uma instância do repositório no construtor do serviço.

Assim precisamos implementar agora o repositório ProductRepository, e vamos fazer isso no projeto Shop.Infra.Data.

Primeiro vamos criar a pasta Repositories neste projeto:

E a seguir criar nesta pasta o arquivo ProductRepository com o código abaixo:

Agora podemos completar a implementação do serviço ProductService na pasta Services do projeto Shop.Application com o código a seguir:

Ufa !!! Estamos quase chegando lá...

Agora o próximo passo é realizar a implementação do projeto Shop.Infrastructure.IoC onde vamos configurar e separar as dependências do nosso projeto.

Configurando o projeto Shop.Infrastructure.IoC

Aqui vamos fazer a Inversão de controle.

Antes de iniciar precisamos incluir uma referência aos projetos Shop.Infra.Data e Shop.Application neste projeto.

Clique com o botão direito do mouse sobre o projeto Shop.Infrastructure.IoC e selecione Add-> Project Reference;

Selecione o projeto Shop.Infra.Data e Shop.Application e clique em OK;



Agora, vamos incluir uma referência ao namespace Microsoft.Extensions.DependencyInjection clicando com o botão direito do mouse em Dependencies e selecione Manage Nuget Packages;

Vá para a guia de Browse e localize o pacote :  Microsoft.Extensions.DependencyInjection



Selecione a versão mais estável (atualmente a versão 3.1.8) e clique em Install.

Agora vamos criar a classe DependencyContainer no projeto onde vamos registrar o serviço e o repositório criados no projeto:

Note como é feita a conexão entre as nossas interfaces e suas implementações a partir de vários projetos em um único ponto de referência.

Esse é o propósito da camada IoC.

Além disso, observe que usamos o tempo de vida AddScoped no registro dos serviços, com isso os serviços são criados uma vez por solicitação do cliente (conexão).

Agora precisamos informar ao projeto MVC sobre a existência deste container.

Vamos abrir o arquivo Startup.cs do projeto Shop.Web.Mvc e incluir após o método Configure o seguinte método:

        private static void RegisterServices(IServiceCollection services)
        {
            DependencyContainer.RegisterServices(services);
        }

E agora dentro do método ConfigureServices do arquivo Startup vamos incluir a linha de código destacada em azul abaixo:

      public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<AppDbContext>(options =>
            {
                options.UseSqlServer(
                    Configuration.GetConnectionString("ShopConnection"));
            });            
            RegisterServices(services);
            services.AddControllersWithViews();
        }

Finalmente agora todas as nossas camadas estão prontas.

A seguir, vamos dar uma olhada em como criar os controladores, usando tudo o que discutimos aqui e implementar a interface com o usuário no projeto MVC.

Primeiro, vamos adicionar alguns dados ao banco de dados, uma vez que estamos implementando apenas o método GetProducts, precisamos adicionar alguns dados manualmente.

Podemos usar o Server Explorer do Visual Studio e incluir uma consulta incluindo os comandos SQL abaixo:

insert into dbo.Products(Name,Price,Quantity) values('Caderno',9.45,100);
insert into dbo.Products(Name,Price,Quantity) values('Lápis',4.25,200);
insert into dbo.Products(Name,Price,Quantity) values('Borracha',2.15,150);
insert into dbo.Products(Name,Price,Quantity) values('Estojo',8.32,90);
insert into dbo.Products(Name,Price,Quantity) values('Caneta',5.99,130);
insert into dbo.Products(Name,Price,Quantity) values('Grampos',1.45,120);

Após executar esses comandos teremos a tabela Products com os seguintes dados:

Na próxima parte do artigo vamos concluir a nossa implementação criando o controlador e a view para exibir os dados dos produtos.

"(Disse Jesus) - Quem ama a sua vida perdê-la-á, e quem neste mundo odeia a sua vida, guardá-la-á para a vida eterna."
João 12:25

Referências:


José Carlos Macoratti