.NET - Usando uma arquitetura em camadas lógicas (n-layer) - I


  Neste tutorial veremos como criar uma aplicação usando a arquitetura em 3 camadas lógicas ou 3-layer.

Atualmente muito tem se escrito e falado sobre Microservices, Domain Drive Design, Clean Architecture , e isso é muito bom, pois indica que a comunidade esta atingindo um nível de maturidade rumo a excelência.

A complexidade destes temas no entanto pode deixar confuso quem esta iniciando agora e não acompanhou o processo de evolução que nos conduziu até hoje. Assim o objetivo deste artigo é apresentar a utilização na plataforma .NET da arquitetura em 3 camadas lógicas ou 3-layer que é uma abordagem tradicional e já muito discutida pela comunidade.

Assim o primeiro esclarecimento que irei fazer será com relação ao termo Camada que é traduzido a partir de Tier ou Layer.

Camada : Tiers ou Layers ?

Na literatura encontram-se com frequência os termos tiers e layers, em inglês, que geralmente são traduzidos como camadas.

Olhando com atenção, embora a diferença seja bem sutil, compreende-se que tiers refere-se a uma separação física dos componentes (diferentes Assemblies, DLLs, arquivos),  enquanto layers aponta para uma separação lógica dos componentes com classes distintas e diferentes espaços de nomes.

As vantagens da abordagem em Camadas

De forma bem simples, o desenvolvimento em camadas procurar dividir a funcionalidade, componentes e o código para uma aplicação, seja para web ou para desktop, em camadas distintas apresentando as seguintes vantagens:

Dessa forma, independente de se usar uma arquitetura em camadas com separação lógica (Layers) ou com separação física (Tiers) a utilização de uma arquitetura em camadas (mais de uma camada) sempre será melhor que usar apenas uma única camada.

O que é uma arquitetura em camadas (3-layer) ?

Aqui o termo Camada significa uma porção reutilizável de código que realiza uma tarefa específica. No ambiente da plataforma .NET, uma camada é usualmente definida como um projeto que representa esta função específica.

Nesta abordagem as  'camadas' indicam a separação lógica dos componentes. A arquitetura em camadas lógicas concentra-se no agrupamento de funcionalidades relacionadas dentro de um aplicativo em camadas distintas que são empilhadas verticalmente umas sobre as outras. Cada camada possui namespaces e classes exclusivas.

Um aplicativo 3-Camadas pode residir no mesmo computador físico (mesma camada física) e, os componentes de cada camada se comunicam com os componentes de outra camada por interfaces bem definidas.

Em C#, cada camada é frequentemente implementada usando o template Class Library em um arquivo DLL - Dynamic Link Libraries.

De forma geral em uma arquitetura em 3-Camadas lógicas temos as seguintes camadas definidas:



1- Camada de apresentação (Presentation Layer - UI)

É a primeira e a camada superior presente no aplicativo onde os usuários podem interagir com o aplicativo.

2- Camada de lógica de negócios (Business Logic Layer - BLL)

Esta é a camada intermediária - o coração do aplicativo. Ele contém toda a lógica de negócios do aplicativo, descreve como os objetos de negócios interagem entre si, onde a camada de apresentação e a camada de acesso a dados podem se comunicar indiretamente.

3- Camada de acesso a dados (Data Access Layer - DAL )

A camada de acesso a dados impõe regras relativas ao acesso aos dados, fornecendo acesso simplificado aos dados armazenados em armazenamento persistente, como o SQL Server. Vale ressaltar que essa camada se concentra apenas no acesso aos dados, em vez de armazenamento de dados. Isso pode criar um pouco de confusão com a camada de dados na arquitetura de 3 camadas com separação física.

Como a arquitetura em 3 camadas lógicas funciona

Nesta abordagem, a camada de apresentação não se comunica diretamente com a camada de acesso a dados. A camada de lógica de negócios funciona como uma ponte entre a camada de apresentação e a camada de acesso a dados.

A seguir temos um fluxo de funcionamento desta arquitetura:

1- A camada de apresentação é a única camada que interage diretamente com o usuário. É usada principalmente para apresentar/coletar dados de usuários e, em seguida, transferi-los para a camada de lógica de negócios para processamento posterior.

2- Depois de receber informações da camada de apresentação, a camada de lógica de negócios faz alguma lógica de negócios nos dados. Durante esse processo, essa camada pode recuperar ou atualizar alguns dados do banco de dados do aplicativo. No entanto, essa camada não se responsabiliza pelo acesso ao banco de dados; ele envia solicitações para a próxima camada, a camada de acesso a dados.

3- A camada de acesso a dados recebe solicitações da camada de lógica de negócios e cria algumas consultas ao banco de dados para lidar com essas solicitações. Assim que a execução é concluída, ele envia o resultado de volta para a camada de lógica de negócios.

4- A camada de lógica de negócios obtém respostas da camada de acesso a dados, conclui o processo e envia o resultado para a camada de apresentação.

5- A camada de apresentação obtém as respostas e as apresenta aos usuários por meio de componentes de UI.

O diagrama abaixo ilustra como funciona a arquitetura de 3 camadas.

Como construir e implantar uma aplicação em 3 camadas lógicas na plataforma .NET ?

A título de exemplo vamos definir uma Solução Tarefas para gerenciar atividades onde podemos criar os seguintes projetos :

- Tarefas.Domain - Objetos de negócios - Entidades (DTOs - Objetos de Transferência de Dados) : Class Library  .NET Core
- Tarefas.Infrastructure - Camada de Acesso a Dados: Class Library .NET Core
- Tarefas.Service - Camada de Lógica de negócios :  Class Library .NET Core
- Tarefas.Web - Camada de Apresentação:  ASP.NET Core 5.0 MVC

A camada Domain - Objetos de Negócios inclui objetos que são usados ​​no aplicativo e funções auxiliares comuns (sem lógica) usadas para todas as camadas. Em uma arquitetura de 3 camadas, esta camada é opcional. No entanto, podemos reduzir o código e assim usar uma camada para manter os códigos que sejam comuns em vez de mantê-los em cada camada é essencial para isso.

A figura a seguir apresenta o esquema da arquitetura em 3 camadas :

O desafio que a arquitetura em 3 camadas cria, é que ela não define explicitamente a responsabilidade de cada camada, o fluxo direcional de informações ou identifica as dependências. Normalmente, ela também apresenta forte acoplamento de componentes, portanto, as alterações em uma camada geralmente exigirão alterações nas outras. Isso reduz os benefícios da programação modular, que valoriza a implantação e o gerenciamento independentes de serviços.

Considerando esses quesitos existem abordagens mais robustas e desacopladas como a Hexagonal Architecture, Onion Architecture e a Clean Architecture.

Assim a arquitetura em 3 ou N camadas se presta a implementações tradicionais de cliente/servidor, mas não é adequada para implantações de aplicações na nuvem mais modernas ou para o desenvolvimento de microsserviços. Em vez disso, considere  arquitetura em camadas como um degrau de aplicativos monolíticos para implantações de nuvem híbrida.

As arquiteturas Hexagonal e Cebola são semelhantes, e os arquitetos que trabalham com microsserviços  tendem a favorecer o modelo limpo, graças à sua natureza centrada no serviço. A coisa mais importante a lembrar é que você precisa considerar sua escolha de modelo com cuidado - é difícil trocar o cavalo no meio do rio.

Criando a solução e os projetos

Vamos criar a solução e os projetos usando a arquitetura em 3 camadas. A título de exemplo nossa aplicação vai gerenciar informações sobre atividades ou tarefas.

Abra o VS 2019 Community clique em new Project e selecione o template Blank Solution informando o nome Tarefas.

Com isso teremos uma solução em branco onde vamos criar os projetos.

A seguir no menu File clique em Add-> New Project e selecione o template  Class Library e informe o nome Tarefas.Domain  a seguir clique em Create.

Repita o procedimento acima e crie os projetos Tarefas.Infrastructure e Tarefas.Service ambos do tipo Class Library.

Vamos agora criar o último projeto que será um projeto que vai usar o template ASP.NET Core Web App (Model-View-Controller) com o nome Tarefas.Web.

Defina as opções conforme mostra a figura a seguir e clique no botão Create:

Ao final teremos a solução Tarefas e os projetos exibidos na janela Solution Explorer conforme abaixo:

Com isso estamos prontos para iniciar o desenvolvimento definindo o código em cada camada. Como isso é uma tarefa que eu já mostrei em outros artigos vou deixar os links abaixo para acompanhamento:

São mais de dez artigos abordando a criação de uma aplicação em camadas usando VB .NET, C#, SQL Server e MySql.

Na próxima parte do artigo vamos apresentar a Clean Architecture e comparar com a arquitetura em Camadas.

"E eu, quando o vi, caí a seus pés como morto; e ele pôs sobre mim a sua destra, dizendo-me: Não temas; Eu sou o primeiro e o último; E o que vivo e fui morto, mas eis aqui estou vivo para todo o sempre. Amém. E tenho as chaves da morte e do inferno."
Apocalipse 1:17,18

Referências:


José Carlos Macoratti