ElisDN писал(а): ↑2017.02.23, 16:32
paurlift писал(а): ↑2017.02.23, 15:34
1.1) На сколько корректно когда entity из одного модуля создает entity из другого модуля?
Если такое необходимо, то это у Вас один модуль.
Если один, то как бы его Вы назвали и где бы Вы создавали отзыв? Отзыв могут оставлять не только клиенты. Да и клиенты еще могут писать на сайт посты на форум, создавать заявку в службу поддержки и т.д. (это я к тому, что так можно все действия связанные с клиентом свалить в один модуль, вместо того чтобы провести между модулями разумную грань в виде однонаправленной связности)
В моем случае - это точно 2 разных модуля.
ElisDN писал(а): ↑2017.02.23, 16:32
paurlift писал(а): ↑2017.02.23, 15:34
1.3) Местонахождения интерфейсов.
Если он нужен для review, то и кладите в review.
AuthorInterface - реализуют разные сущности и нужен он не только для review.
Я так понял, что для Вас нормальная ситуация, когда интерфейс лежит в одном модуле, а его реализация в другом? (Это своего рода тоже coupling, только за счет интерфейса менее критичный)
ElisDN писал(а): ↑2017.02.23, 16:32
paurlift писал(а): ↑2017.02.23, 15:34
3) Mapper или Repository знает о domain. Mapper - это же инфраструктура? Почему он знает так много о domain?
Естественно, что класс сохранения сущности в базу знает всё о сущности. Лишь бы не наоборот.
Не находите в этом нарушения слоенной архитектуры? Если то что мапер знает namespace модели, можно еще как-то отнести к исключению, то вот как Вы относитесь к явному созданию VO при сборке агрегата ($client->phoneNumbers[] = new PhoneNumber($phoneNumber);) ?
ElisDN писал(а): ↑2017.02.23, 16:32
paurlift писал(а): ↑2017.02.23, 15:34
4.1) У репозитория есть интерфейс, где он должен находится?
Интерфейс - в домене. Реализация - в инфраструктуре.
Я говорю здесь про репозиторий у которого нет домена. В application сервисе вызываю метод репозитория, который сохранит данные для аналитики. В этом случае где должен лежать интерфейс репозитория?
ElisDN писал(а): ↑2017.02.23, 16:32
paurlift писал(а): ↑2017.02.23, 15:34
7) Интефейсы инфраструктурных сервисов кладем на доменный уровень, чтобы не лишать себя возможности использовать их в Domain Service?
Интерфейс - в домене. Реализация - в инфраструктуре.
Я не понял, я правильно сформулировал причину? Пример, у меня есть инфраструктурный сервис отправляющий уведомления клиентам всеми доступными способами(email, sms). 90% случаев использования этого сервиса:
Код: Выделить всё
namespace application/payment;
use domain/contracts/infrastructure/NotificationServiceInterface;
class PaymentService
{
public function __construct(NotificationServiceInterface $notificationService)
{
$this->notificationService = $notificationService;
}
public function execute()
{
// Оплата
$this->notificationService->notify('success_buy', $client);
}
}
Т.е. почти всегда это операционный уровень, и разумно было положить интерфейс NotificationServiceInterface куда-то на уровень application, у домена нет к нему никакой привязки. Но, завтра мне нужно его использовать в доменном сервисе, а интерфейс то уже лежит в application. Мне придется переносить интерфейс на доменный уровень.