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