Skip to content

Domain слой (contexts/{context}/domain/)

@azure-net/kit не предоставляет конкретных компонентов для работы с Domain слоем, в связи с тем что доменный слой в каждом проекте довольно уникален.

Общие наставления

  • Создавайте папки в доменном слое по сущностям
  • Делите папки на ports и model, в первой храним типы ответов репозитория, во второй саму сущность которая актуальна для нашего фронта
  • Вы можете хранить константы и enums от бизнес сущности в этом слое, но не храните здесь константы ui-слоя (те что отвечают например за переводы или ассоциации текста к какому то из перечислений сущности)
  • Если сущность, которая пришла с бэкенда должна быть преобразована для использования на фронте - используте mapUsing или mapCollectionUsing в слое infrastructure (методы есть в ResponseBuilder, документация и описание с примерами в документации по этому слою)
  • Бизнес логика сущности находится в этом слое
  • Вы можете создавать интерфейсы репозиториев в этом слое, если хотите полномасштабно следовать DDD и подменять реализации в провайдерах
  • При описании сущностей используйте интерфейсы, так как классы не сериализуются при работе с ssr и вам все равно придется приводить класс к объекту если хотите вернуть его со стороны сервера на клиент
  • Реализуйте бизнес-логику из слоя domain в сценарной логике слоя application
  • Всегда задумывайтесь об уместности бизнес-логики, ибо наличие сложной бизнес-логики и вычислений присуща бэкенду, нежели фронтенду и бизнес-логика в чистом виде редкость

Пример организации доменного слоя


├── domain
│   ├── article
│   │   ├── enums
│   │   │   ├── ArticleStatuses.ts
│   │   │   ├── ArticleTypes.ts
│   │   │   └── index.ts
│   │   ├── index.ts
│   │   ├── model
│   │   │   └── index.ts
│   │   └── ports
│   │       └── index.ts
│   ├── auth
│   │   ├── index.ts
│   │   └── ports
│   │       ├── ILoginRequest.ts
│   │       ├── ILoginResponse.ts
│   │       └── index.ts