大量依赖对象作为构造函数参数

时间:2014-07-31 18:23:59

标签: php interface dependency-injection

我刚刚了解了依赖注入。但是我遇到了这个问题:因为我的一些类的依赖对象可能是非常大的数字,所以将它们全部传递给类构造函数可能会很长并且不清楚,例如,< / p>

interface FooInterface { 
    function fooMethod(); 
} 

class Foo implements FooInterface { 
    function fooMethod(){
        return 'Foo';
    } 
}

class Boo
{
    public $foo;

    public function __construct(FooInterface $foo) // This one is ok because it depends on one object only,
    {
        $this->foo = $foo;
    }
}

class BooFactory
{
    public static function create()
    {
        return new Boo(new Foo);
    }
}

$a = new BooFactory;
$b = $a->create();
var_dump($b->foo->fooMethod());

如果它取决于很多物体,

class Boo
{
        public function __construct(FooInterface $foo, TooInterface $boo, PooInterface $poo, etc, etc ,etc, etc, etc) 
        {
        //
         }
}

看起来太多了你不觉得?还是正常的?或者我还应该做些什么呢?

1 个答案:

答案 0 :(得分:2)

如果您的类实际上对所有这些对象具有硬依赖关系(即不是可选依赖关系),则执行此操作是有效的。如果某些依赖项是可选的(例如,也许你可以注入一个记录器,但如果它不存在你只是不执行任何记录),那么考虑从构造函数中删除它们并使用setter注入。

Setter注入是您正常地将$foo属性添加到您的类的位置,但是从构造函数的参数中省略它。然后,您需要为您的班级提供setFoo(Foo $foo)方法,以便您可以根据需要注入Foo个实例。

当一个类有很长的参数列表时,它可能是一个&#34;代码气味&#34;你的班级试图做太多而可能不遵循single responsibility principle。如果你的类试图做太多,可以考虑将你的代码重构为一些相互消耗的小类。