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:
ASP .NET Core - Criando uma aplicação com Angular 2 - Macoratti.net
ASP .NET Core - Criando uma aplicação Web no ... - Macoratti.net
ASP .NET Core - Iniciando com o Blazor - Macoratti
ASP .NET Core - CRUD usando Blazor e Entity ... - Macoratti
Blazor - O novo framework SPA da Microsoft - Macoratti.net
Visual Studio Code - Suporte ao desenvolvimento Blazor