Вопросы по существу по DDD
-
- Сообщения: 200
- Зарегистрирован: 2011.03.02, 21:11
Вопросы по существу по DDD
1. Верно ли я понимаю, что:
application - сервисы
domain - доменый слой (сущности, интерфейсы репозиториев, фабрики, стратегии и т.д. - то что помогает работе сущности)
infrastructure - реализация интерфейсов репозиториев
presentation - контролеры, вьюхи
2. Где нужно размещать код по созданию сущности? Почему не стоит метод create (EntityDTO $dto) в самой сущности? ПРОсто часто замечаю, что код по созданию сущности выносят в сервис, в сервисе же вызывают репозиторий.
3. Вызывать репозиторий в сущности верный подход? Это ведь по сути один слой. Значит они могут знать друг о друге. Это я снова к вопросу №2 про создание сущности.
4. Насколько верно то, что сущность будет знать про DTO? не совсе мверно, как по мне. Если так, то поулчается наши DTO-шки тоже явля.ются частью домена.
Спасибо.
application - сервисы
domain - доменый слой (сущности, интерфейсы репозиториев, фабрики, стратегии и т.д. - то что помогает работе сущности)
infrastructure - реализация интерфейсов репозиториев
presentation - контролеры, вьюхи
2. Где нужно размещать код по созданию сущности? Почему не стоит метод create (EntityDTO $dto) в самой сущности? ПРОсто часто замечаю, что код по созданию сущности выносят в сервис, в сервисе же вызывают репозиторий.
3. Вызывать репозиторий в сущности верный подход? Это ведь по сути один слой. Значит они могут знать друг о друге. Это я снова к вопросу №2 про создание сущности.
4. Насколько верно то, что сущность будет знать про DTO? не совсе мверно, как по мне. Если так, то поулчается наши DTO-шки тоже явля.ются частью домена.
Спасибо.
Re: Вопросы по существу по DDD
сервисы - слишком общее название. Сервисами является практически все, что не обладает состоянием. Опять же в ddd есть сервисы application, domain и infrastructure слоев.MaratCrash писал(а):1. Верно ли я понимаю, что:
application - сервисы
Но в целом упрощенно application можно понимать как сервисный слой (прокладка между контроллерами и доменом).
в общем даMaratCrash писал(а):domain - доменый слой (сущности, интерфейсы репозиториев, фабрики, стратегии и т.д. - то что помогает работе сущности)
infrastructure - реализация интерфейсов репозиториев
presentation - контролеры, вьюхи
ddd неразрывно с SOLID, а первое S означает "единственная/единичная ответственность".MaratCrash писал(а):2. Где нужно размещать код по созданию сущности? Почему не стоит метод create (EntityDTO $dto) в самой сущности? ПРОсто часто замечаю, что код по созданию сущности выносят в сервис, в сервисе же вызывают репозиторий.
Плюс нет какого-то единичного маппинга между DTO и сущностью. Одна сущность может создаваться в различных эндпойнтах (экшнах) с различным количеством входных данных и соответственно с разными DTO, обрабатываемыми разными хэндлерами.
приемлемыйMaratCrash писал(а):3. Вызывать репозиторий в сущности верный подход?
поясниMaratCrash писал(а):Это я снова к вопросу №2 про создание сущности.
не верно. DTO просто выполняет служебные функции в контексте приложения (app layer) для переноса данных между реквестом и и сервисом в общем случаеMaratCrash писал(а):4. Насколько верно то, что сущность будет знать про DTO?
-
- Сообщения: 200
- Зарегистрирован: 2011.03.02, 21:11
Re: Вопросы по существу по DDD
А в чем суть доменных сервисов, когда я могу создать служебные классы в домене - стратегии и фабрики те же самые, к примеру?zelenin писал(а):сервисы - слишком общее название. Сервисами является практически все, что не обладает состоянием. Опять же в ddd есть сервисы application, domain и infrastructure слоев.MaratCrash писал(а):1. Верно ли я понимаю, что:
application - сервисы
Но в целом упрощенно application можно понимать как сервисный слой (прокладка между контроллерами и доменом).
Это я про то, насколько корректно в методах сущности использовать интерфейсы репозиториев. Смысл этого вижу в том, чтобы не дублировать участки кода в сервисном слое. К примеру, необходимо сравнить сущность с другой (того же типа сущности). Для этого необходимо считать сущность (с которой сравниваем) из хранилища.zelenin писал(а):приемлемыйMaratCrash писал(а):3. Вызывать репозиторий в сущности верный подход?поясниMaratCrash писал(а):Это я снова к вопросу №2 про создание сущности.
Понятно. А где DTO должна "теряться"? К примеру, прилетает в контроллер, мы далее передаем DTO-ку в вызываемый сервис. Вот там получается из DTO извлекается все необходимое, оформляется в сущность и передается дальше, так?zelenin писал(а):не верно. DTO просто выполняет служебные функции в контексте приложения (app layer) для переноса данных между реквестом и и сервисом в общем случаеMaratCrash писал(а):4. Насколько верно то, что сущность будет знать про DTO?
Re: Вопросы по существу по DDD
например посчитать общую сумму заказа, используя стратегии. Или бизнес-процесс, который нельзя поместить в одной сущности.MaratCrash писал(а):А в чем суть доменных сервисов, когда я могу создать служебные классы в домене - стратегии и фабрики те же самые, к примеру?
я про создание сущности прошу пояснить. Не вижу тут места созданию сущности. Тем более репозиторий уже готовую вернет.MaratCrash писал(а):Это я про то, насколько корректно в методах сущности использовать интерфейсы репозиториев. Смысл этого вижу в том, чтобы не дублировать участки кода в сервисном слое. К примеру, необходимо сравнить сущность с другой (того же типа сущности). Для этого необходимо считать сущность (с которой сравниваем) из хранилища.zelenin писал(а):приемлемыйMaratCrash писал(а):3. Вызывать репозиторий в сущности верный подход?поясниMaratCrash писал(а):Это я снова к вопросу №2 про создание сущности.
так.MaratCrash писал(а):Понятно. А где DTO должна "теряться"? К примеру, прилетает в контроллер, мы далее передаем DTO-ку в вызываемый сервис. Вот там получается из DTO извлекается все необходимое, оформляется в сущность и передается дальше, так?zelenin писал(а):не верно. DTO просто выполняет служебные функции в контексте приложения (app layer) для переноса данных между реквестом и и сервисом в общем случаеMaratCrash писал(а):4. Насколько верно то, что сущность будет знать про DTO?
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Вопросы по существу по DDD
А я вот думаю не так.zelenin писал(а):так.MaratCrash писал(а):Понятно. А где DTO должна "теряться"? К примеру, прилетает в контроллер, мы далее передаем DTO-ку в вызываемый сервис. Вот там получается из DTO извлекается все необходимое, оформляется в сущность и передается дальше, так?zelenin писал(а):не верно. DTO просто выполняет служебные функции в контексте приложения (app layer) для переноса данных между реквестом и и сервисом в общем случае
DTO (Data Transfer Object) объект передачи данных из одного слоя в другой, без разницы какие.
Жду Yii 3!
Re: Вопросы по существу по DDD
ну мы про конкретный кейс, т.к. в общем dto - просто объект передачи данных, без слоев.slavcodev писал(а):А я вот думаю не так.zelenin писал(а):так.MaratCrash писал(а): Понятно. А где DTO должна "теряться"? К примеру, прилетает в контроллер, мы далее передаем DTO-ку в вызываемый сервис. Вот там получается из DTO извлекается все необходимое, оформляется в сущность и передается дальше, так?
DTO (Data Transfer Object) объект передачи данных из одного слоя в другой, без разницы какие.
-
- Сообщения: 200
- Зарегистрирован: 2011.03.02, 21:11
Re: Вопросы по существу по DDD
Так Вы DTO и в сущности передаете?zelenin писал(а):ну мы про конкретный кейс, т.к. в общем dto - просто объект передачи данных, без слоев.slavcodev писал(а):А я вот думаю не так.zelenin писал(а):так.
DTO (Data Transfer Object) объект передачи данных из одного слоя в другой, без разницы какие.
Re: Вопросы по существу по DDD
с чего вы так решили?MaratCrash писал(а):Так Вы DTO и в сущности передаете?zelenin писал(а):ну мы про конкретный кейс, т.к. в общем dto - просто объект передачи данных, без слоев.slavcodev писал(а): А я вот думаю не так.
DTO (Data Transfer Object) объект передачи данных из одного слоя в другой, без разницы какие.
-
- Сообщения: 200
- Зарегистрирован: 2011.03.02, 21:11
Re: Вопросы по существу по DDD
Сори, промахнулся, вопрос больше наверное к slavcodev. Т.к. он написал, что для DTO неважно в какой слой прилетать. Как по мне, если DTO в сущности передавать, то тогда эти DTO придется перетащить в доменный слой. Что не совсем гуд.zelenin писал(а):с чего вы так решили?MaratCrash писал(а):Так Вы DTO и в сущности передаете?zelenin писал(а): ну мы про конкретный кейс, т.к. в общем dto - просто объект передачи данных, без слоев.
Re: Вопросы по существу по DDD
ну он прав - dto это понятие не какого-то определенного слоя, но про передачу dto в сущности он ничего не писал.MaratCrash писал(а):Сори, промахнулся, вопрос больше наверное к slavcodev. Т.к. он написал, что для DTO неважно в какой слой прилетать. Как по мне, если DTO в сущности передавать, то тогда эти DTO придется перетащить в доменный слой. Что не совсем гуд.zelenin писал(а):с чего вы так решили?MaratCrash писал(а):
Так Вы DTO и в сущности передаете?
Вы поймите, что dto - это просто "объект для переноса данных". Он не несет какого-то специфического для ddd значения. Просто в ddd оно обычно служит для переноса данных из реквеста в сервис.
-
- Сообщения: 200
- Зарегистрирован: 2011.03.02, 21:11
Re: Вопросы по существу по DDD
Так почему он прав, если в сущности нельзя DTO кидать?! То что DTO можно кидать в другие слои и таскать с контролеры в сервисы, а из сервисов в другие сервисы - это все понятно
Re: Вопросы по существу по DDD
он не говорил можно или нельзя. Он сказал, что dto служит для переноса данных.MaratCrash писал(а): Так почему он прав, если в сущности нельзя DTO кидать?!
-
- Сообщения: 200
- Зарегистрирован: 2011.03.02, 21:11
Re: Вопросы по существу по DDD
Понял.
Как Вы думаете:
1. Я сейчас делаю валидацию (первичную) на уровне контроллера. Нужно ли делать валидацию на уровне сущностей? Мне кажется, это оверхед.
2. Создание сущностей Вы где делаете? Про экшнКОнтроллера-МетодСервиса понятно. Сервисы вообще получаетстя нужны ислючительно как связующее звено (я про уровень Application). Так во тв самом сервисе Вы вызываете репозиторий или же вызываете нечто другое? Условие - сущность без зависимостей от других сущностей, все просто.
Как Вы думаете:
1. Я сейчас делаю валидацию (первичную) на уровне контроллера. Нужно ли делать валидацию на уровне сущностей? Мне кажется, это оверхед.
2. Создание сущностей Вы где делаете? Про экшнКОнтроллера-МетодСервиса понятно. Сервисы вообще получаетстя нужны ислючительно как связующее звено (я про уровень Application). Так во тв самом сервисе Вы вызываете репозиторий или же вызываете нечто другое? Условие - сущность без зависимостей от других сущностей, все просто.
Re: Вопросы по существу по DDD
Валидировать можно dto, из которого будет создана сущность. Можно базовую валидацию делать тайп хинтингом в сигнатуре конструктора, можно в самом конструторе или методах сущности также валидировать входящие данные. Но в целом слой валидации должен быть в сервисах.MaratCrash писал(а):Понял.
Как Вы думаете:
1. Я сейчас делаю валидацию (первичную) на уровне контроллера. Нужно ли делать валидацию на уровне сущностей? Мне кажется, это оверхед.
ну передаете dto в сервис, валидируете, создаете напрямую или фабрикой сущность, сохраняете в репозитории.MaratCrash писал(а):2. Создание сущностей Вы где делаете? Про экшнКОнтроллера-МетодСервиса понятно. Сервисы вообще получаетстя нужны ислючительно как связующее звено (я про уровень Application). Так во тв самом сервисе Вы вызываете репозиторий или же вызываете нечто другое? Условие - сущность без зависимостей от других сущностей, все просто.
-
- Сообщения: 200
- Зарегистрирован: 2011.03.02, 21:11
Re: Вопросы по существу по DDD
Бывают такие ситуации, когда придется в репозиторий передавать 10 параметров в метод Вы в тиаком случае тоже DTO не использщуете? И если нет, то как решаете такой момент? Прописывать в мето все 10 параметров - сигнатура становится адски несносной, мягко говоря
Re: Вопросы по существу по DDD
например?MaratCrash писал(а):Бывают такие ситуации, когда придется в репозиторий передавать 10 параметров в метод
dto в общем смысле или в конкретном, про который до этого общались?MaratCrash писал(а):Вы в тиаком случае тоже DTO не использщуете?
дело вкуса. Конкретно к архитектуре не относится. Вообще почитайте ветки соседние - мы тут уже все основные вопросы обсуждали, в т.ч. queryobject для репозитория.MaratCrash писал(а):И если нет, то как решаете такой момент? Прописывать в мето все 10 параметров - сигнатура становится адски несносной, мягко говоря
- slavcodev
- Сообщения: 3134
- Зарегистрирован: 2009.04.02, 21:42
- Откуда: Valencia
- Контактная информация:
Re: Вопросы по существу по DDD
DTO - я считаю просто массив данных представленный объектом. Для чего? Для type-hinting аргументов или return type. Со свойствами класса удобнее работать чем с ключами массива, особенно при рефакторинге и тестах.MaratCrash писал(а):Сори, промахнулся, вопрос больше наверное к slavcodev. Т.к. он написал, что для DTO неважно в какой слой прилетать. Как по мне, если DTO в сущности передавать, то тогда эти DTO придется перетащить в доменный слой. Что не совсем гуд.
Исходя из этого, да DTO можно передавать в сущность.
Предполагаю под "перетащить в доменный слой", ты имеешь виду неймспейс класса, и хотя я не большой фан группировки классов по слоям, но не вижу ничего плохого существование DTO класса в доменной слое, если он к нему относится.
Жду Yii 3!
-
- Сообщения: 200
- Зарегистрирован: 2011.03.02, 21:11
Re: Вопросы по существу по DDD
Понятно.
А где вы размещаете адаптеры различные? К примеру, у меня конкретный случай. Есть билинг провайдер. И отправку запросов по АПИ я делаю гузлом (guzzle). Причем биллинг провайдер может меняться и это нужно учесть в коде. Вот момент работы с гузлом размещат ьв домене, как я полагаю, не верно. Делаю адаптер для этого, интерфейс адаптеры в домене, но вот куда положить реализацию задумался Вроде как это слой приложения (Application) больше.
А где вы размещаете адаптеры различные? К примеру, у меня конкретный случай. Есть билинг провайдер. И отправку запросов по АПИ я делаю гузлом (guzzle). Причем биллинг провайдер может меняться и это нужно учесть в коде. Вот момент работы с гузлом размещат ьв домене, как я полагаю, не верно. Делаю адаптер для этого, интерфейс адаптеры в домене, но вот куда положить реализацию задумался Вроде как это слой приложения (Application) больше.
Re: Вопросы по существу по DDD
провайдеры могут быть разными, их может быть много, реализации могут быть большими - прекрасный момент для выноса в отдельный модуль. А в нашем конкретном домене оставить только интерфейс сервиса оплаты.
-
- Сообщения: 200
- Зарегистрирован: 2011.03.02, 21:11
Re: Вопросы по существу по DDD
Интерфейс я как раз и оставляю в домене, да. А вот реализацию выношу, это да. Но куда именно это вы бы вынесли? Я сейчас это вынес все на уровень Application. НЕ в сервисы, а просто в отдельные класссы, которые подтягиваю в сервисах нужных.