Pular para o conteúdo

apps/architecture/onion

042 · Arquiteturas de Alto Nível (Macro-Architecture) · ≈ 5 min de estudo

Arquitetura Onion (Cebola)

O modelo de domínio fica no centro e as camadas o envolvem em anéis: serviços de domínio, serviços de aplicação e infraestrutura. Toda dependência aponta para dentro — o centro não conhece banco, HTTP nem biblioteca. Use quando a regra de negócio precisa sobreviver à troca de banco, framework ou canal de entrada.

passos
6
arquivos
6
testes
0
tecnologias
5
Infraestrutura realTypeScriptBunElysiaPostgreSQLDocker
Baixar cartão

Cenário

Banco digital com transferência entre contas sujeita a saldo, limite diário (que zera sozinho na virada do dia) e bloqueio por suspeita de fraude. Congelar uma conta é outra operação de negócio, com caso de uso próprio; o efeito dela aparece como recusa do domínio na transferência seguinte.

Planta

Fluxo
6/6
InfraestruturaServicos de aplicacaoServicos de dominioModelo de dominiocontroller_accountHTTP e presentergateway_account_postgresSQL e transacaomain.tscomposition rootUseCaseFundsTransferUseCaseAccountFreezefundsTransferInterfaceAccountGatewayAccounttransferValidate,transferApplyimplementa
6

6 passos — reproduza para seguir o fluxo

Como funciona

6 passos

Camadas concêntricas em torno do modelo.

Esconde cada passo: lembre antes de tocar para revelar.

  1. 01

    domain_model/account.ts tem o tipo Account e funções puras: transferValidate devolve o motivo da recusa, transferApply devolve contas novas sem mutar as originais

  2. 02

    domain_services/service_account.ts coordena as duas contas e declara o gateway por intenção (accountsLock, transferRecord, frozenMark) — nunca um update genérico

  3. 03

    application_services tem um caso de uso por operação (UseCaseFundsTransfer, UseCaseAccountFreeze), que abre a unidade de trabalho e devolve um DTO

  4. 04

    A infraestrutura implementa o gateway no PostgreSQL (contas travadas em ordem de id, uma transação) e o presenter traduz o resultado em HTTP e reais

  5. 05

    infrastructure/main.ts é o único ponto que conhece todos os anéis

  6. 06

    ring_dependency.test.ts falha se um anel importar outro mais externo ou se o centro importar qualquer pacote

Trade-offs

O que se ganha, o que se paga

4 vantagenscada ganho tem um preço4 custos

Vantagens

  • Regra testável sem banco nem HTTP

  • Trocar banco ou framework não toca os anéis internos

  • Direção das dependências verificada por teste

  • Um caso de uso por operação, sem classe-deus

Custos

  • Mais arquivos e indireções que um CRUD

  • Curva de aprendizado da regra de dependência

  • Mapeamento entre linha, domínio e DTO em cada fronteira

  • Excesso para domínio sem regra relevante

apps/architecture/onion

6 arquivos

./

  • Modelo de domíniosrc/domain_model/account.ts
  • Serviços de domíniosrc/domain_services/service_account.ts
  • Serviços de aplicaçãosrc/application_services/use_case_account.ts
  • Infraestruturasrc/infrastructure/gateway_account_postgres.ts
  • Infraestruturasrc/infrastructure/controller_account.ts
  • Infraestruturasrc/infrastructure/main.ts

Executar · com Docker

  1. ./docker.sh up# sobe PostgreSQL
  2. cp .env.example .env# variáveis de ambiente
  3. bun install# dependências
  4. bun run demo# roda o cenário
  5. bun run test# integração contra o serviço real
Requisitos
BunDocker
Sobe junto
PostgreSQL

Por que se relacionam

Teste rápido

Qual destes combina com Onion Architecture?

Próximo projeto · Arquiteturas de Alto Nível (Macro-Architecture)Domain-Driven Design (DDD)
Esc

↑ ↓ navegarEnter abrir191 resultados