2015-06-04 42 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

相关问题