DDD архитектура

Обсуждаем, как правильно строить приложения
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

DDD архитектура

Сообщение sda »

Читал кусками большую синюю книгу эванса и ddd квикли. Скажите правильно ли я понял основную суть ddd архитектуры.

domain layer - здесь хранятся Entities и Value objects. Entities имеют состояние и поведение, это и есть бизнес-логика нашей доменной модели. Также здесь хранятся фабрики для создания сложных составных Entities (которые в ddd называют аггрегатами Aggregate) и интерфейсы репозиториев.

infrastructure layer - здесь хранятся реализации репозиториев и сервисов, которые зависят от инфраструктуры. Например наш MailerService, который отправляет элекронные письма зависит от низкоуровневой библиотеки, например такой как swiftmailer и поэтому должен находится в этом слое.

application layer - здесь хранятся реализации сервисов, которые относятся к уровню приложения. Мне это сложно объяснить, поэтому я попробую показать на примере псевдокода как может выглядеть сервис уровня приложения для регистрации нового пользователя на сайте:

Код: Выделить всё

namespace app\src\application;

use app\src\domain\entities\user\User;
use app\src\domain\entities\user\UserRepositoryInterface;
use app\src\infrastructure\MailerServiceInterface;

class UserService {
    __construct(UserRepositoryInterface $userRepository, MailerServiceInterface $mailerService) {
        $this->userRepository = $userRepository;
        $this->mailerService = $mailerService;
    }
    
    signup(Request $request) {
        $params = $request->getPostParams();
        $user = new User($params->email, $params->password);
        $this->userRepository->save($user);
        $this->mailerService
            ->setFrom('from@domain.com')
            ->setTo($user->email)
            ->setSubject('Вы успешно зарегистрировались')
            ->setBody('Поздравляем!');
            
        return $user;
    }
}
Эти сервисы вызываются контроллерами фреймворка. Эти сервисы регистрируются в контейнере зависимостей, вместе с сервисами и репозиториями уровня инфраструктуры.

В итоге entities с бизнес-логикой в domain layer не зависят от других слоев и мы можем их таскать из фреймворка в фреймворк (окружение). Сервисы из application layer тоже можно таскать, но для них нужно разрешить зависимости из infrastructure layer. Самый нестабильный код получается инкапсулирован в infrastructure layer и если например меняется swiftmailer на что-то другое, то мы пишем новую реализацию и тоже самое с репозиториями.

Здесь я уверен далеко не всё, в ddd там дофига всего, но скажите верно ли я понял основую суть ddd архитектуры или нет?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: DDD архитектура

Сообщение samdark »

Да, вроде верно.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: DDD архитектура

Сообщение zelenin »

sda писал(а):В итоге entities с бизнес-логикой в domain layer не зависят от других слоев и мы можем их таскать из фреймворка в фреймворк (окружение). Сервисы из application layer тоже можно таскать, но для них нужно разрешить зависимости из infrastructure layer. Самый нестабильный код получается инкапсулирован в infrastructure layer и если например меняется swiftmailer на что-то другое, то мы пишем новую реализацию и тоже самое с репозиториями.
вы забыли про Presentation слой. Он единственный, который нельзя таскать с собой (хотя если сильно хочется, то можно).
Остальные слои без проблем переносятся, в т.ч. infrastructure.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: DDD архитектура

Сообщение samdark »

Вообще наличие непременно всех этих слоёв — не непременное требование. Каждый из них даёт свои плюсы. Если часть их не нужна, количество слоёв можно сократить.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: DDD архитектура

Сообщение zelenin »

почему какой-то слой может быть не нужен?
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: DDD архитектура

Сообщение samdark »

Ну мало ли... мне вот не интересно на некоторых проектах разделять домен и инфраструктуру. Простые они, ни к чему. А вот слой приложения можно и выделить.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: DDD архитектура

Сообщение zelenin »

Sam Dark писал(а):мне вот не интересно на некоторых проектах разделять домен и инфраструктуру
ну если имеется в виду, что инфраструктура 100% меняться не будет, то ок.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: DDD архитектура

Сообщение samdark »

Именно это и имеется.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: DDD архитектура

Сообщение samdark »

Вообще лучше сначала сделать несколько раз правильно, а потом уже искать компромиссы вроде ↑
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: DDD архитектура

Сообщение zelenin »

Sam Dark писал(а):Вообще лучше сначала сделать несколько раз правильно, а потом уже искать компромиссы вроде ↑
это очень верно.
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: DDD архитектура

Сообщение sda »

Про Presentation не забыл, просто не стал писать, мне с этими 3 важнее разобраться, чтобы понять куда какой код класть.

Sam Dark еще интересно, правильно ли я понимаю, что фреймворк относится к инфраструктуре и поэтому в infrastructure layer можно делать обращения к фреймворку. Я понимаю, что фреймворк это наверное одно из первых, что может измениться в инфраструктуре с выходом новой мажорной версии. Но всё же с точки зрения ddd архитектуры правильно ли я понимаю, что фреймворк относится к инфраструктуре точно также как и библиотеки типа swiftmailer и всякие базы данных?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: DDD архитектура

Сообщение zelenin »

фреймворк - это presentation.
инфраструктура - это реализации сервисов. Они делаются на библиотеках (в т.ч. на библиотеках из каких-то фреймворков).
Т.к. основная фича ddd - слои, то ни один слой не вызывает друг друга напрямую. Поэтому ответ - нет, в инфраструктуре вы не дергаете фреймворк.
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: DDD архитектура

Сообщение sda »

http://aspnetboilerplate.com/Pages/Docu ... chitecture
Здесь в Presentation не увидел ничего связаного с фреймворком.

Еще http://fideloper.com/hexagonal-architec ... 1918201412
1. is Framework layer referring to Infrastructure layer in DDD?
The framework layer might contain Ruby on Rails if you're on Ruby, or Cake on PHP. You'll have to provide glue to use the framework's classes in your app. That sounds like part of infrastructure to me.
Еще http://welcometothebundle.com/domain-dr ... chitecture
Infrastructure Layer: and finally how to implement them, the choice of the framework should be made in this final layer.
Т.к. основная фича ddd - слои, то ни один слой не вызывает друг друга напрямую. Поэтому ответ - нет, в инфраструктуре вы не дергаете фреймворк.
Я не понимаю, почему я немогу в infrastructure layer дергать фреймворк если я хочу реализовать репозитории с помощью Yii DAO или Yii ActiveRecord или если я хочу реализовать MailService с помощью Yii Swiftmailer. Реализация репозиториев будет завязана на Yii2 инфраструктуру, вместо PDO/mysqli или какой-то другой библиотеки. Поменяли doctrine на propel - нужно переписать репозитории. Поменяли yii2 dao на doctrine - нужно переписать репозитории. Никакой разницы. Почему тогда doctrine инфраструктура, а yii2 не инфраструктура?
Последний раз редактировалось sda 2016.09.06, 01:49, всего редактировалось 1 раз.
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: DDD архитектура

Сообщение sda »

Кажется, что истина где-то по середине и фреймворк можно частично отнести к presentation layer с его controllers и views, а все остальное к infrastructure layer.
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: DDD архитектура

Сообщение rugabarbo »

Компоненты фреймворка !== Фреймворк

Особенно хорошо это видно в Symfony.
Гораздо хуже это видно в Yii в силу высокой связанности компонентов, поэтому появляется ваше заблуждение.

Например, в том же Yii я использую компонент http://symfony.com/doc/current/componen ... olver.html для эмуляции именованных параметров. Значит ли это, что я программирую на фреймворке Symfony?
Последний раз редактировалось rugabarbo 2016.09.06, 10:00, всего редактировалось 1 раз.
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: DDD архитектура

Сообщение sda »

rugabarbo, мне интересно, не нарушаю ли я DDD архитектуру если пишу репозитории в infrastructure layer используя yii2 dao ?
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: DDD архитектура

Сообщение rugabarbo »

Нет, не нарушаете. Тем более, что DAO-компоненты в Yii достаточно хорошо абстрагированы от остальных компонентов фреймворка. Их можно рассматривать как отдельную библиотеку. Будто она и не из Yii вовсе.
Аватара пользователя
rugabarbo
Сообщения: 1063
Зарегистрирован: 2015.06.21, 16:21
Контактная информация:

Re: DDD архитектура

Сообщение rugabarbo »

Вообще, если мы говорим про PHP, то в DDD-архитектуре под фреймворком лучше всего понимать микрофреймворки. Например, тот же Slim. Это избавит вас от лишних заблуждений. Вы сразу поймёте истинную роль фреймворка во всех этих слоях (:
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: DDD архитектура

Сообщение sda »

rugabarbo, спасибо.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: DDD архитектура

Сообщение zelenin »

sda писал(а):http://aspnetboilerplate.com/Pages/Docu ... chitecture
Здесь в Presentation не увидел ничего связаного с фреймворком.
Presentation - это контроллеры и вьюшки (то, что есть в любом фреймворке)
sda писал(а):Я не понимаю, почему я немогу в infrastructure layer дергать фреймворк если я хочу реализовать репозитории с помощью Yii DAO или Yii ActiveRecord или если я хочу реализовать MailService с помощью Yii Swiftmailer. Реализация репозиториев будет завязана на Yii2 инфраструктуру, вместо PDO/mysqli или какой-то другой библиотеки. Поменяли doctrine на propel - нужно переписать репозитории. Поменяли yii2 dao на doctrine - нужно переписать репозитории. Никакой разницы. Почему тогда doctrine инфраструктура, а yii2 не инфраструктура?
я выше написал: следует различать фреймворк и компоненты фреймворка
Закрыто