.NET - A arquitetura Cebola (Onion Architecture)


 Neste artigo vou apresentar a definição e os conceitos básicos sobre a arquitetura Cebola ou Onion Architecture.

O que é arquitetura de cebola?

O termo Onion Architecture foi cunhado por Jeffrey Palermo em 2008. Essa arquitetura fornece uma alternativa robusta para criar aplicativos para uma melhor testabilidade, manutenção e confiabilidade nas infraestruturas como bancos de dados e serviços.

Seu principal objetivo é enfrentar os desafios encontrados pela arquitetura em três camadas ou arquitetura de n camadas e fornecer uma solução para problemas comuns, como acoplamento e separação de responsabilidades.

A arquitetura de cebola esta baseada no princípio da inversão de controle e é composta por várias camadas concêntricas que se interconectam em direção ao núcleo que representa o domínio. Ela não depende da camada de dados como nas arquiteturas clássicas em várias camadas, mas dos modelos de domínio reais.

A arquitetura em camadas x Onion Architecture

Conforme a arquitetura em camadas tradicional, a camada da interface do usuário interage com a lógica de negócios, e a lógica de negócios conversa com a camada de dados, e todas as camadas são misturadas e dependem muito uma da outra.

Nas arquiteturas de três e n-camadas, nenhuma das camadas é independente; esse fato levanta uma separação de responsabilidades. Tais sistemas são muito difíceis de entender e manter. A desvantagem dessa arquitetura tradicional é o acoplamento desnecessário.

A Onion Architecture resolveu esse problema definindo camadas a partir do núcleo para a infraestrutura. Ela Aplica a regra fundamental movendo todos os acoplamentos em direção ao centro, sendo que no centro da Onion Architecture está o modelo de domínio, que representa os objetos de negócios e comportamento. Ao redor da camada de domínio existem outras camadas, com mais comportamentos.

As camadas de arquitetura de cebola

A Onion Architecture usa o conceito de camadas, mas são diferentes das camadas da arquitetura de três e n-camadas. Vamos ver o que cada uma dessas camadas representa e o que deve conter.

1- Camada de Domínio (a camada mais interna)

A camada de domínio reside na parte central da arquitetura Onion, e representa os objetos de negócios e o comportamento. A idéia é ter todos os seus objetos de domínio nesse núcleo. Ele contém todos os objetos de domínio do aplicativo. Além dos objetos de domínio, você também pode ter interfaces de domínio. Essas entidades de domínio não têm dependências. Objetos de domínio também são simples como deveriam ser, sem nenhum código pesado ou dependências. (Se um aplicativo for desenvolvido usando um ORM como o Entity Framework,  essa camada conterá classes POCO.)

2- Camada de Repositório (Repository Layer)

Essa camada cria uma abstração entre as entidades do domínio e a lógica de negócios do aplicativo. Nesta camada, geralmente adicionamos interfaces que fornecem o comportamento de salvar e recuperar objetos, geralmente envolvendo um banco de dados. Essa camada consiste no padrão de acesso a dados, que é uma abordagem mais fracamente acoplada ao acesso a dados. Também criamos um repositório genérico e adicionamos consultas para recuperar dados da fonte, mapear os dados da fonte de dados para uma entidade comercial e persistir alterações na entidade comercial na fonte de dados.

3- Camada de Serviços (Service Layer)

A camada de serviços mantém interfaces com operações comuns, como Adicionar, Salvar, Editar e Excluir. Além disso, essa camada é usada para se comunicar com a camada da interface do usuário e a camada do repositório. A camada de serviço também pode conter lógica de negócios para uma entidade. Nesta camada, as interfaces de serviço são mantidas separadas de sua implementação, tendo em mente o acoplamento e a separação de responsabilidades.

4- Camada de Interface do Usuário (UI Layer)

É a camada mais externa e mantém responsabilidades periféricas como interface do usuário e testes. Pode ser uma aplicação Web, uma API, um projeto de Testes, etc. Essa camada possui uma implementação do padrão da injeção de dependência, para que o aplicativo construa uma estrutura fracamente acoplada e possa se comunicar com a camada interna por meio de interfaces.

A implementação da Arquitetura Cebola

Não existe nenhuma orientação fornecida pelas diretrizes da Onion Architecture sobre como as camadas devem ser implementadas. O arquiteto deve decidir a implementação e pode escolher qualquer nível de classe, pacote, módulo ou qualquer outra coisa necessária para adicionar à solução.

Vantagens e desvantagens da arquitetura Onion

A seguir, estão algumas vantagens da implementação da Onion Architecture:

Algumas desvantagens da arquitetura Onion, como a seguir:

Conclusão

A arquitetura Cebola tem sido muito utilizada atualmente, sendo uma opção mais frequente à arquitetura em camadas. Ela é uma arquitetura poderosa e está intimamente ligada a outros dois estilos arquitetônicos como a arquitetura em camadas e a arquitetura hexagonal.

É importante compreender o seu funcionamento e utilização pois representa uma opção atraente e poderosa que dependendo do cenário pode ser a solução indicada para o seu projeto de software.

"Portanto, agora nenhuma condenação há para os que estão em Cristo Jesus, que não andam segundo a carne, mas segundo o Espírito."
Romanos 8:1

Referências:


José Carlos Macoratti