GO-DDD: modelo de design acionado por domínio em Golang
Bem-vindo ao go-ddd , um repositório de implementação/modelo de referência que demonstra a abordagem de design orientado por domínio (DDD) em Golang. Este projeto tem como objetivo ajudar desenvolvedores e arquitetos a entender a estrutura DDD, especialmente no contexto do GO, e como isso pode levar a bases de código mais limpas, sustentáveis e escaláveis.
Visão geral
O design orientado ao domínio é um padrão de metodologia e design usado para criar software corporativo complexo, conectando a implementação a um modelo em evolução. go-ddd mostra isso configurando um mercado simples onde Sellers podem vender Products .
Por que DDD?
- Linguagem onipresente : promove uma linguagem comum entre desenvolvedores e partes interessadas.
- Isolamento da lógica do domínio : a lógica do domínio é separada das camadas de infraestrutura e aplicativo, promovendo princípios sólidos.
- Escalabilidade : permite transições de arquitetura de microsserviços mais fáceis.
Estrutura do repositório

-
domain : o coração do software, representando a lógica e as regras de negócios.-
entities : objetos fundamentais em nosso sistema, como Product e Seller . Contém lógica de validação básica.
-
application : contém operações específicas de uso de uso que interagem com a camada de domínio. -
infrastructure : suporta as camadas mais altas com recursos técnicos, como acesso ao banco de dados.-
db : acesso e modelos de banco de dados. -
repositories : implementações concretas de nossas necessidades de armazenamento.
-
interface : a camada externa que interage com o mundo exterior, como os terminais da API.-
api/rest : manipuladores ou controladores para gerenciar solicitações e respostas HTTP.
Outros princípios
- Domínio
- Não deve depender de outras camadas.
- Fornece infraestrutura com interfaces, mas não deve acessar a infraestrutura.
- Implementa a lógica e as regras dos negócios.
- Executa validações em entidades. As entidades validadas são passadas para a camada de infraestrutura.
- A camada de domínio define os padrões de entidades (por exemplo, UUID para ID ou registro de data e hora de criação). Não defina os padrões na camada de infraestrutura ou mesmo no banco de dados!
- Não vaze os objetos de domínio para o mundo exterior.
- Aplicativo
- O código de cola entre o domínio e a camada de infraestrutura.
- Infraestrutura
- Os repositórios são responsáveis por traduzir uma entidade de domínio para um modelo de banco de dados e recuperá -lo. Nenhuma lógica de negócios é executada aqui.
- Implementa interfaces definidas pela camada de domínio.
- Implementa a lógica de persistência, como acessar um banco de dados PostGres ou MySQL.
- Ao escrever para armazenamento, leia os dados escritos antes de retorná -los. Isso garante que os dados sejam gravados corretamente.
Práticas recomendadas
- Não retorne entidades validadas dos métodos de leitura no repositório. Em vez disso, retorne o tipo de entidade de domínio diretamente.
- As validações podem mudar no futuro e você não deseja alterar todos os dados no seu banco de dados.
- Caso contrário, você não poderá ler dados do banco de dados que foi escrito com uma lógica de validação diferente.
- Não coloque valores padrão (por exemplo, registro de data e hora atual ou ID) no banco de dados. Defina -os na camada de domínio (fábrica!) Por vários motivos:
- É bastante perigoso ter duas fontes de verdade.
- É mais fácil testar a camada de domínio.
- Os bancos de dados podem ser substituídos e você não precisa alterar todos os seus valores padrão.
- Sempre leia a entidade após a gravação na camada de infraestrutura.
- Isso garante que os dados sejam gravados corretamente e nunca estamos operando em dados obsoletos.
-
find Vs get :- Os métodos
find podem retornar nulos ou uma lista vazia. - Os métodos
get devem retornar um valor. Se o valor não for encontrado, faça um erro.
- Exclusão: sempre use a exclusão suave. Crie uma coluna
deleted_at no seu banco de dados e defina -a como o registro de data e hora atual ao excluir uma entidade. Dessa forma, você sempre pode restaurar a entidade, se necessário.
Começando
- Clone este repositório:
git clone https://github.com/sklinkert/go-ddd.git
cd go-ddd
go mod download
go run ./...
Contribuições
Contribuições, questões e solicitações de recursos são bem -vindos! Sinta -se à vontade para verificar a página de problemas.
Licença
Distribuído sob a licença do MIT. Consulte a licença para obter mais informações.