0

не уверен, что я слишком устал и что-то пропустил, поэтому заранее извиняюсь.Инъекция зависимостей интерфейса репозитория для объекта спецификации домена

У меня есть домен 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. Мне не нравится вводить из контейнера в Домен, но не думаю, что есть лучший способ, если вы не используете другую архитектуру.

ответ

0

Я думаю, что вы чрезмерны.

Спецификация шаблон прохладный, если используется в очень общей сигнатуре метода, который принимает спецификации в качестве параметров, или если у вас есть целый ряд спецификаций. При наличии одного или двух особых условий для тестирования это может быть излишним.

Кроме того, попытка вставить репозиторий в объект домена (как я думаю, вы) может вызвать у вас больше проблем, чем пользы. Строковая длина, скорее всего, не является правилом домена и уникальностью may not be either. Возможно, вам лучше проверить эти ограничения на уровне Application Service (или Controller), напрямую вызвав репозиторий там для уникальности, что избавит вас от всех проблем с впрыском.

+0

Спасибо. Извините, если я не объясню достаточно хорошо. Я использовал их как простые примеры для всех правил домена. Это лишь основные правила (за исключением уникальности, которая должна быть бизнес-правилом). Не волнуйтесь, у меня есть несколько валидаций в других слоях. Сам домен имеет несколько других важных правил, и это всего лишь один контекст объекта. Мой вопрос не о шаблоне, а о реализации. Имеет ли это смысл? Вопрос в том...как избежать того, чтобы модель зависела от репозитория или минимизировала как можно больше. Если можно полностью избежать этого, тогда хорошо и хорошо :) –

+0

По моему опыту, 95% правил домена, для которых вам не нужен репозиторий, потому что они состоят из одного Агрегата и Агрегированного корня, есть все, что необходимо для их принудительного применения , – guillaume31

+0

5% логики домена может возникать за пределами данного агрегата (главным образом в доменных службах), но затем вы можете передать Службе объекты домена, которые ему нужны, а не репозиторий. – guillaume31

Смежные вопросы