2015-06-04 6 views
0

Как сделать зависимость Инъекция объектов в репозиторий, если эти объекты имеют необходимые аргументы для построения?Как сделать зависимость Инъекция объектов в репозиторий, если эти объекты имеют необходимые аргументы для построения?

Возьмите этот простой пример (в 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 в репозитории?

+1

Отражение обычно используется для того, чтобы объект мог быть создан без вызова бизнес-конструктора, а затем каждое частное поле задано через отражение. Однако в вашем случае, почему вы не можете просто вернуть 'new Person (dataset.firstName, ...)'? – plalx

+0

Посмотрите, как это делает Doctrine 2. Конструкторы никогда не вызываются при увлажнении из базы данных. И да, он использует отражение для выполнения задачи. http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/getting-started.html – Cerad

+4

Почему вы так или иначе введете «Person» в конструктор репозиториев? –

ответ

1

Читайте перевод информации о "Abstract Factory". Это образец.

class PersonRepository 
{ 
    public function __construct(PersonFactory $factory){ 
     $this->personFactory = $factory; 
    } 

    public function getById($id) 
    { 
     // ... 
     return $this->personFactory->create($row['name'], $row['surname'], ...); 
    } 
} 
+0

А, не думал о фабрике. И это хорошо подходит для тестирования. Блестящий @Abe! – prograhammer

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

  • Нет связанных вопросов^_^