Как сделать зависимость Инъекция объектов в репозиторий, если эти объекты имеют необходимые аргументы для построения?Как сделать зависимость Инъекция объектов в репозиторий, если эти объекты имеют необходимые аргументы для построения?
Возьмите этот простой пример (в PHP, но вопрос в том, зависит от конкретного языка):
лицо Entity
class Person
{
private $firstName = "";
private $middleName = "";
private $lastName = "";
private $dateOfBirth;
private $dateOfDeath;
public function __construct($firstName, $middleName = "", $lastName)
{
$this->firstName = $firstName;
$this->middleName = $middleName;
$this->lastName = $lastName;
// Validation
if(empty($this->firstName) || empty($this->lastName){
throw new Exception("first and last name required");
}
}
// ...
}
Person Repository
class PersonRepository
{
public function __construct(Person $person) // <-- problem, need required arguments
{
$this->person = $person;
}
public function fetchById($id)
{
// Query database
// ...
// Hydrate and return a person object
// ...
return $person;
}
// ...
}
Так что я отсутствующий ? Каков стандартный подход для ввода объекта и избежать использования оператора new
в репозитории?
Отражение обычно используется для того, чтобы объект мог быть создан без вызова бизнес-конструктора, а затем каждое частное поле задано через отражение. Однако в вашем случае, почему вы не можете просто вернуть 'new Person (dataset.firstName, ...)'? – plalx
Посмотрите, как это делает Doctrine 2. Конструкторы никогда не вызываются при увлажнении из базы данных. И да, он использует отражение для выполнения задачи. http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/getting-started.html – Cerad
Почему вы так или иначе введете «Person» в конструктор репозиториев? –