2014-11-14 81 views
0

你是如何处理有很多依赖注入的类?在PHP OOP中依赖注入的关联数组依赖关系?

我可以将依赖关系存储在关联数组中,并将它们作为一个进行传递?

class Auth 
{ 
    // Set props. 
    protected $deps; 
    protected $Database; 
    protected $Constant; 
    protected $PasswordHash; 
    // and so on... 

    /** 
    * Construct data. 
    */ 
    public function __construct($deps) 
    { 
     // Set DI. 
     $this->deps = $deps; 
     $this->Database = $this->deps['Database']; 
     $this->PasswordHash = $this->deps['PasswordHash']; 
     // and so on... 
    } 
} 

在我的容器,

// Set deps. 
$deps = [ 
    "Database" => $Database, 
    "PasswordHash" => new PasswordHash(HASH_COST_LOG2, HASH_PORTABLE), 
    // and so on... 
]; 

// Instantiate Auth. 
// Provide deps. 
$Auth = new Auth($deps); 

我以前没有做过任何测试与单元测试。那么这个关联阵列依赖关系在DI的设计模式中是可以接受的。它可以被测试吗?

或者有更好的解决方案吗?

+0

你有没有研究过DI容器作为变体,因为你总是会修改你的数组和__construct是否想改变依赖关系? – sergio

+0

是的,我有。看到我上面的编辑。谢谢。 – laukok

+0

不,我的意思是不像简单的数组容器,看起来扔了Symfony \ Dependency Injection,Zend \ Di,PHP-DI等等。他们取代所有的依赖关系。 – sergio

回答

1

注入数组感觉不对。通过使用构造函数注入,你应该强制客户端注入这些依赖关系。注入包含依赖关系的数组完全不会强制客户端。

如果几乎Auth类中的所有方法都依赖于已传递到数组中的构造函数的对象,请随意将所有依赖项定义为构造函数中的单独参数。如果不是,请考虑更改您的设计。您可能将太多的功能组合到一个班级中。如果您对课程的设计感到满意,可以说2种方法取决于Database,其他3取决于PasswordHash,另一种取决于Session等,使用setter注入非常见的依赖关系,并在需要时注入它们。

+0

谢谢。我认为'使用setter注入非常见的依赖关系,并在需要时注入它们。“是解决方案。感谢你的回答。 – laukok