2

我一直在阅读依赖注入,我想我非常了解这些概念,包括构造函数注入和 setter 注入。

但是,我不确定在以下情况下我会做什么:

假设我有一个具有许多方法的类,但其中只有一个方法需要某个其他对象。如何将此对象提供给该方法?我是否应该像这样直接将对象作为参数传递给方法:

class aClass
{
    function aMethod(anotherClass $anotherClass)
    {
        anotherClass->hello();
    }

    function otherMethods()
    {
    }
    .....
}

另一种选择是将它提供给整个班级,这似乎没有必要。像这样:

class aClass
{
    protected $_anotherClass;

    function aMethod()
    {
        anotherClass->hello();
    }

    function otherMethods()
    {
    }
    .....

    function setAnotherClass(anotherClass $anotherClass)
    {
            $this->_anotherClass;
    }
}

什么时候应该将对象传递给方法,什么时候应该通过构造函数/设置器使用依赖注入?何时使用这两个选项之一是否有经验法则或最佳实践?

提前感谢您的帮助。

4

2 回答 2

2

你提到了一个经验法则,所以这里是:

问自己一个问题: 有人可以合法地对同一个对象调用此方法两次,为两次调用中的参数提供不同的值吗?

如果是,则将其保留为参数。如果不是,那么正如您所描述的,它是一个很好的注射候选者。

是第一种方法的一个很好的例子,其中删除参数并在类中注入依赖项将是一个非常糟糕的主意。C# 而不是 PHP,但你明白了。

于 2011-12-09T01:17:22.493 回答
1

一个类的内部工作与该类本身无关。如果只有一个函数需要依赖,那就这样吧。

或者,您可能想知道为什么只有一个函数具有依赖关系,您的班级可能会做两件不同的事情吗?

您不想在构造函数中注入依赖项的唯一原因是制作该资源的成本非常高(在磁盘上准备一个大文件,连接到远程主机等),但即使在这种情况下,您也可以通过在“代理”或“延迟”对象中作为“承诺”,如果需要,您可以访问依赖项。

于 2011-12-09T01:15:09.743 回答