не уверен, что я слишком устал и что-то пропустил, поэтому заранее извиняюсь.Инъекция зависимостей интерфейса репозитория для объекта спецификации домена
У меня есть домен php, который мне нужен для реструктуризации, потому что закончился с использованием анемичной модели с использованием сервисов. Это связано с тем, что я не использую Doctrine, но Eloquent by Laravel в качестве моего картографа (причины связаны с привязкой к другим типам серверов БД)
Моя рассмотренная структура должна быть чем-то подобным: (Я только в том числе несколько вещей для этого примера)
У шаблона Entity есть TemplateName как VO. Имя шаблона должно удовлетворять 2 спецификациям. Должно быть больше 3 символов и должно быть уникальным.
Я использую TemplateRepositoryInterface, чтобы проверить уникальность, и интерфейс имеет реалистичную реализацию, ограниченную поставщиком услуг.
Поэтому шаблон Entity имеет метод:
public function create()
{
if ($this->meetsTemplateNameSpecification())
{
//fire events etc... saving to repo is done one step above from a service that call this class and gets $this to send tot he interface
return $this;
}
throw new InvalidArgumentException("Template name is not valid.");
}
Тогда мой метод meetsTemplateNameSpecification:
private function meetsTemplateNameSpecification($originalTemplateName = null)
{
$templateNameSpecification = new TemplateNameSpecification($this->name, $originalTemplateName);
if($templateNameSpecification->isMet())
{
return true;
}
return false;
}
До этого реструктуризации, сервис был инициируя все эти и передавая RepositoryInterface им так, чтобы было легко. Тем не менее, таким образом я не знаю, как и/или где передавать или вводить интерфейс, потому что, если я его впрыснул из контейнера в класс Specification, то я не могу инициировать его из Entity, и я не могу внедрить класс Spec в объект либо потому, что я хочу иметь возможность использовать его конструктор.
Мне очень сложно делать это в PHP и Active Record, сохраняя разделение проблем и не зависимо от сохранения в домене.
У кого-нибудь есть лучшая структура? Дайте мне знать, если вам нужно больше кода, пожалуйста. До сих пор единственное решение, которое приходит на ум, - это статические методы в моих объектах спецификации, чтобы их не нужно было инициировать, и я могу ввести зависимость Repo из контейнера. Это путь, или есть лучшие способы работы с PHP. Мне не нравится вводить из контейнера в Домен, но не думаю, что есть лучший способ, если вы не используете другую архитектуру.
Спасибо. Извините, если я не объясню достаточно хорошо. Я использовал их как простые примеры для всех правил домена. Это лишь основные правила (за исключением уникальности, которая должна быть бизнес-правилом). Не волнуйтесь, у меня есть несколько валидаций в других слоях. Сам домен имеет несколько других важных правил, и это всего лишь один контекст объекта. Мой вопрос не о шаблоне, а о реализации. Имеет ли это смысл? Вопрос в том...как избежать того, чтобы модель зависела от репозитория или минимизировала как можно больше. Если можно полностью избежать этого, тогда хорошо и хорошо :) –
По моему опыту, 95% правил домена, для которых вам не нужен репозиторий, потому что они состоят из одного Агрегата и Агрегированного корня, есть все, что необходимо для их принудительного применения , – guillaume31
5% логики домена может возникать за пределами данного агрегата (главным образом в доменных службах), но затем вы можете передать Службе объекты домена, которые ему нужны, а не репозиторий. – guillaume31