2015-06-04 44 views
0

如果這些實體需要構造參數,如何執行將實體依賴注入到存儲庫中?如何執行依賴將實體注入到存儲庫中,如果這些實體需要構造參數?

拿這個簡單的例子中(PHP,但問題是語言無關):

Person實體

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"); 
     } 
    } 

    // ... 
} 

人庫

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

反射通常用於實體可以實例化而不調用業務構造函數,然後通過反射設置每個私有字段。然而在你的情況下,爲什麼你不能返回'新人(dataset.firstName,...)'? – plalx

+0

看看Doctrine 2如何做到這一點。從數據庫保溼時,構造函數永遠不會被調用。是的,它使用反射來完成任務。 http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/tutorials/getting-started.html – Cerad

+4

爲什麼要在存儲庫構造函數中注入一個'Person'? –

回答

1

閱讀關於「抽象工廠」。這是一種模式。

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

相關問題