Onion Architecture: Definição, Camadas e Benefícios.
A Onion Architecture é um padrão de arquitetura que permite sistemas sustentáveis, testáveis, independentes e evolutivos.
O que é Onion Architecture?
Onion Architecture (Arquitetura cebola) é um padrão arquitetural introduzido por Jeffrey Palermo para reduzir o forte acoplamento e separar os interesses da maioria das arquiteturas tradicionais, fornecendo um modelo confortável de construir aplicativos em perspectiva de testabilidade, manutenção e confiabilidade.
De acordo com a arquitetura tradicional, a camada de 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 umas das outras. Com isso, nenhuma camada é independente. Sistemas assim são muito difíceis de entender e manter, pois geram muito acoplamento desnecessário.
A Onion Architecture resolveu esse problema definindo camadas do núcleo até a infraestrutura (Baseadas no princípio de inversão de controle). No centro está o modelo de domínio (entidades), que representa os objetos de negócios e de comportamento. Ao redor da camada de domínio estão outras camadas, com mais comportamentos.
A imagem mostra que a camada de infraestrutura conhece a camada de aplicação e a camada de domínio. A camada de aplicação não conhece a infraestrutura, porém conhece o domínio.
O domínio não conhece nada além dele. Com isso, a arquitetura cebola oferece um grande incentivo ao desenvolvimento orientado a domínio (DDD), visto que o negocio é o centro de tudo.
O numero de círculos não é realmente importante e podem haver vários. O importante é que quanto mais perto do centro mais estável é seu código.
Camadas da arquitetura Onion (Layers)
As camadas da Onion interagem umas com as outras usando as interfaces. Para isso cada camada envolve a outra de fora para dentro (e sempre nesse sentido) interagindo entre si em direção ao núcleo que representa o domínio.
Durante o caminho da camada mais externa para mais interna, o input em uma camada é transformado para um input na camada seguinte e assim sucessivamente até chegar no centro. Nesse ponto um output é processado e encaminhado de volta até sair do sistema pela camada mais externa.
Cada camada tem sua relevância dentro da arquitetura que será apresentada a seguir, da camada mais externa até o centro.
Infrastructure Layer - (Adapters)
Camada mais externa da aplicação. Interage com os limites de I/O — entrada e saída do sistema e é responsável por permitir o sistema de acessar as coisas no mundo externo, como um banco de dados, web services, arquivos, etc.
Aqui são encontrados objetos ORM (entidades do hibernate, por exemplo), interfaces de persistência, factories responsáveis por converter o modelo do banco para o modelo de domínio, etc.
Application Services Layer
Também conhecida como camada de serviço, essa camada é responsável por fazer a orquestração do que chega da camada mais externa (Infrastructure Layer).
Diferente da arquitetura tradicional, mesmo apresentando o mesmo nome, a application layer não tem regra de negócio e sua finalidade é facilitar o acesso a algo, que no caso é nosso domínio.
A camada de serviço é responsável por representar um caso de uso. Que tem por objetivo o controle de transação de negocio, ou seja, ela é o responsável por abrir um único commit ou rollback após que todas as operações daquele caso de uso sejam realizadas.
Além de representar os controllers, e objetos de InputModel/ViewModel.
Domain Services Layer
Define eventos específicos de domínio. Esses são eventos como concluir pedidos, enviar pedidos, devolver pedidos e assim por diante. Podemos definir essas ações como regra de negócio que não se encaixa em uma entidade.
Um exemplo, persistir uma entidade envolve acessar um componente externo, isso esta além da responsabilidade de uma entidade, por isso ele para na domain service.
Domain Model Layer
Na parte central da Onion Architecture, existe a camada de domínio. Ela define o estado e o comportamento das entidades. A ideia é ter todos os seus objetos de domínio neste núcleo sem dependências externas, ou seja, essa camada deve depender apenas de si mesma.
Ao observar as classes desta camada, você deve ser capaz de determinar a finalidade da sua aplicação.
Benefícios da Onion
Existem várias vantagens da Arquitetura Onion, conforme listado abaixo.
- Ele fornece melhor manutenção, pois as camadas possui baixo nível de acoplamento. A camada externa do aplicativo sempre se comunica com a camada interna por meio de interfaces. As camadas internas nunca dependem da camada externa.
- Ele fornece melhor testabilidade, pois o teste de unidade pode ser criado para camadas separadas sem o efeito de outros módulos do aplicativo.
- Ele desenvolve um aplicativo fracamente acoplado, pois a camada externa do aplicativo sempre se comunica com a camada interna por meio de interfaces. As camadas internas nunca dependem da camada externa.
- Todas as dependências externas, como acesso ao banco de dados e chamadas de serviço, são representadas em camadas externas.
- As camadas da Onion Architecture são conectadas por meio de interfaces. As implantações são fornecidas durante o tempo de execução.