Я занимаюсь проектированием базовой архитектуры веб-приложения. В проекте используется подход доменно-ориентированного дизайна, поскольку бизнес-модель и логика очень сложны.
Проект также нацелен на то, чтобы стать проектом SOA (сервис-ориентированная архитектура). Так что я много узнаю о Сервисах и о том, как построить проект на их основе.
После предыдущего моего вопроса , У меня вопрос относительно ассоциаций в классах моделей.
Я понимаю, что классы моделей не должны знать и делать что-либо, связанное с постоянством. Однако у меня возникают проблемы с определением ситуаций с ассоциацией между классами моделей.
Например:
- класс
Person - класс
Carимеет один драйвер (для примера)
Где должны быть getDriver и getCars?
- в модельных классах:
$car->getDriver() - в сервисном слое с примитивными типами:
$personService->getPerson($car->getDriverId()) - на уровне сервиса с использованием ООП:
$carService->getDriver($car)
Решение 1. кажется более естественным. Я использую Doctrine 2, поэтому ассоциации модели обрабатываются с помощью аннотаций сопоставления БД. Таким образом, модель не делает ничего, связанного с постоянством (хотя на самом деле делает через Doctrine). Это мое любимое решение, но в чем тогда смысл Сервиса, кроме как загрузить список "машин" для начала?
Решение 2. кажется просто глупым, потому что оно отбрасывает ООП, а пользователь модели / службы должен знать о модели базы данных для получения ассоциации (он должен знать, что этот идентификатор является идентификатором «человека»). И он должен сам провести ассоциацию.
Решение 3. немного лучше, чем решение 2, но все же где ООП?
Итак, для меня решение 1. самое лучшее. Но я видел, как Решение 2 и Решение 3 использовалось в реальных проектах (иногда смешанных вместе), и поэтому у меня есть сомнения.
И вопрос усложняется, когда появляются дополнительные параметры, например:
$person->getCars($nameFilter, $maxNumberOfResults, $offset);
(в данном случае это действительно похоже на запрос SQL / запрос на сохранение)
Итак, какую из них следует использовать для архитектуры модели / услуги в проекте, соответствующем подходу доменно-ориентированного проектирования? Должна ли моя модель с SOA быть только «тупым» контейнером данных без логики? Если да, то где же подход DDD?