我刚刚了解了依赖注入。但是我遇到了这个问题:因为我的一些类的依赖对象可能是非常大的数字,所以将它们全部传递给类构造函数可能会很长并且不清楚,例如,< / 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)
{
//
}
}
看起来太多了你不觉得?还是正常的?或者我还应该做些什么呢?
答案 0 :(得分:2)
如果您的类实际上对所有这些对象具有硬依赖关系(即不是可选依赖关系),则执行此操作是有效的。如果某些依赖项是可选的(例如,也许你可以注入一个记录器,但如果它不存在你只是不执行任何记录),那么考虑从构造函数中删除它们并使用setter注入。
Setter注入是您正常地将$foo
属性添加到您的类的位置,但是从构造函数的参数中省略它。然后,您需要为您的班级提供setFoo(Foo $foo)
方法,以便您可以根据需要注入Foo
个实例。
当一个类有很长的参数列表时,它可能是一个&#34;代码气味&#34;你的班级试图做太多而可能不遵循single responsibility principle。如果你的类试图做太多,可以考虑将你的代码重构为一些相互消耗的小类。