Я исследую проблему, хорошо описанную здесь .
Допустим, у меня есть эта модель anemi c (ничего не проверяет, просто DAO):
interface User {
public function setEmail(string $value): void;
public function getEmail(): string;
}
Давайте реорганизуем его на не-anemi c:
interface User {
public function getEmail(): string;
/**
* @throws UserEmailInvalidException
*/
public function updateContactInfo(string $email): void;
}
User::updateContactInfo
теперь отвечает за проверку электронной почты (например, ни один другой пользователь не зарегистрирован с этим адресом электронной почты).
Поскольку интерфейс реализован как Doctrine Entity (или Document для ODM), он не знает об уровне обслуживания и не может получить доступ к UserRepository для проверки дубликатов.
Моя идея - переместить logi c на уровне обслуживания (мы все еще считаем, что некоторые службы принадлежат модели предметной области). Итак, реорганизованное решение:
interface User {
public function getEmail(): string;
}
interface UpdateUserContactInfo {
/**
* @throws UserEmailInvalidException
*/
public function execute(User $user, string $email): void;
}
Подходит ли такое решение с точки зрения антипаттернов моделей DDD и Anemi c? Верно ли предположение, что услуги могут быть частью модели предметной области? Я что-то упускаю?
Примечание: на самом деле мы действительно сохраняем в основном только интерфейсы в модели предметной области, поскольку реализация выполняется на уровне инфраструктуры.