GO-DDD: шаблон дизайна, управляемый доменом, в Golang
Добро пожаловать в go-ddd , справочный репозиторий реализации/шаблона, демонстрирующий подход DOMAIN-управляемого (DDD) в Голанге. Этот проект направлен на то, чтобы помочь разработчикам и архитекторам понять структуру DDD, особенно в контексте GO, и как это может привести к более чистым, более обслуживаемым и масштабируемым кодовым базам.
Обзор
Design Design, управляемый доменом,-это методология и шаблон проектирования, используемый для создания сложного корпоративного программного обеспечения путем подключения реализации к развивающейся модели. go-ddd демонстрирует это, создавая простой рынок, где Sellers могут продавать Products .
Почему DDD?
- Вездесущий язык : продвигает общий язык между разработчиками и заинтересованными сторонами.
- Выделение логики домена : логика домена отделена от слоев инфраструктуры и приложений, способствуя солидным принципам.
- Масштабируемость : обеспечивает более простые переходы архитектуры микросервисов.
Структура репозитория

-
domain : сердце программного обеспечения, представляющее бизнес -логику и правила.-
entities : фундаментальные объекты в нашей системе, такие как Product и Seller . Содержит основную логику проверки.
-
application : содержит специфические операции использования, которые взаимодействуют с доменным уровнем. -
infrastructure : поддерживает более высокие уровни с техническими возможностями, такими как доступ к базе данных.-
db : доступ к базе данных и модели. -
repositories : конкретные реализации наших потребностей в хранении.
-
interface : внешний слой, который взаимодействует с внешним миром, как конечные точки API.-
api/rest : Хэндлеры или контроллеры для управления HTTP -запросами и ответами.
Дальнейшие принципы
- Домен
- Не должен зависеть от других слоев.
- Обеспечивает инфраструктуру с интерфейсами, но не должна получить доступ к инфраструктуре.
- Реализует бизнес -логику и правила.
- Выполняет проверку на объектах. Утвержденные организации передаются на уровень инфраструктуры.
- Доменные слои устанавливают по умолчанию сущностей (например, UUID для идентификации или временной метки создания). Не устанавливайте по умолчанию на уровне инфраструктуры или даже в базе данных!
- Не утечь объекты домена во внешний мир.
- Приложение
- Клейский код между доменом и уровнем инфраструктуры.
- Инфраструктура
- Репозитории несут ответственность за перевод доменного объекта в модель базы данных и ее извлечение. Никакая бизнес -логика здесь не выполнена.
- Реализует интерфейсы, определяемые доменным слоем.
- Реализует логику стойкости, такую как доступ к базе данных Postgres или MySQL.
- При написании на хранилище прочитайте письменные данные, прежде чем вернуть их. Это гарантирует, что данные написаны правильно.
Лучшие практики
- Не возвращайте проверенные объекты из методов чтения в репозитории. Вместо этого верните тип домена объекта напрямую.
- Валидации могут измениться в будущем, и вы не хотите менять все данные в вашей базе данных.
- В противном случае вы не сможете прочитать данные из базы данных, которая была написана с другой логикой проверки.
- Не размещайте значения по умолчанию (например, текущая временная метка или идентификатор) в базу данных. Установите их в доменном слое (фабрика!) По нескольким причинам:
- Это довольно опасно иметь два источника истины.
- Легче проверить доменное слой.
- Базы данных могут быть заменены, и вы не хотите менять все значения по умолчанию.
- Всегда читайте сущность после записи в слое инфраструктуры.
- Это гарантирует, что данные написаны правильно, и мы никогда не работаем на устаревших данных.
-
find VS get :-
find методы могут вернуть нуль или пустой список. -
get методы должны вернуть значение. Если значение не найдено, добавьте ошибку.
- Удаление: всегда используйте мягкое удаление. Создайте столбец
deleted_at в вашей базе данных и установите его на текущую временную метку при удалении объекта. Таким образом, вы всегда можете восстановить сущность, если это необходимо.
Начиная
- Клонировать это хранилище:
git clone https://github.com/sklinkert/go-ddd.git
cd go-ddd
go mod download
go run ./...
Вклад
Взносы, проблемы и запросы на функции приветствуются! Не стесняйтесь проверять страницу проблем.
Лицензия
Распределено по лицензии MIT. Смотрите лицензию для получения дополнительной информации.