2013-07-03 43 views
2

我很苦恼于依赖注入容器的想法。依赖注入如何知道要传递哪些变量?

不知道如何解释,但我会尝试用几个例子:

class foo 
{ 
    public function __construct(\Somenamespace\Bar $bar, $x) 
    { 

    } 
} 

的DIC怎么会知道什么“X”会是谁?

如果我们走得更远,看看酒吧课。 DIC可以用反射创建Bar没有问题。

namespace \Somenamespace; 
class bar 
{ 
    public function __construct(\SomethingElse\Tap $tap, $y) 
    { 

    } 
} 

酒吧想要水龙头,龙头也可以由DIC找到,但它怎么知道'y'?

如果我们创建了水龙头。

namespace\SomethingElse; 
class tap 
{ 
    public function __construct($amountOfTaps) 
    { 

    } 
} 

DIC如何知道水龙头量或其他变量?

编辑:

同样的问题确实为如果微调后的类型是一个接口或一个抽象类。 DIC如何弄清楚他需要创建什么?

+0

这取决于DIC是如何实现的。你在使用Symfony吗? –

+0

它将在配置中为DIC – Orangepill

+0

@ChrisHanson指定不具有任何DIC特定。只是想知道它是如何完成的。特别是当命名空间发挥作用时。因为他们怎么抬头? – John

回答

2

这是一个很好的和一个有效的问题。

这是可能的答案的之一:容器无法知道

public function __construct(\Somenamespace\Bar $bar, $x) 
  • $bar\Somenamespace\Bar一个实例,容易
  • $x可以是任何东西...的容器无法确切知道你想要什么。

因此,大多数容器停在这里,并要求您明确定义(例如在配置文件中)$x应该注入哪些依赖关系。


然而一些容器可以尝试猜测。例如:

public function __construct($exportService) 

容器可以假设变量名可以是服务名称,所以它会尝试注入命名exportService的依赖。

我不知道任何PHP的容器这样做,我计划实施,在未来PHP-DI


同样为“接口注入”

public function __construct(Some\GoodInterface $x) 

在Java中,容器可以知道,在一个项目(它们在WAR/JAR档案的所有分组的所有类)。所以Java容器可以查找接口的所有实现。

如果只有一个,它会自动使用它。

在PHP中,通过自动加载,容器无法知道项目的所有类。总而言之,它无法猜测要注入什么实现。

所以像上面,你必须定义手动使用哪一个实现(配置文件,...)

0

我最好的选择是PHP中的IoC容器使用Reflection(就像.NET和Java中的IoC容器一样)。下面是展示如何体现在类型和获得它的构造函数的参数的参数名的例子:

$reflector = new ReflectionClass('SomeClass'); 

$parameters = $reflector->getConstructor()->getParameters(); 

foreach ($parameters as $parameter) { 
    echo $parameter->name; 
} 
+0

他们将如何知道要传递哪个变量?可以说我反映了像\ Name \ Space \ Foo \ Bar之类的东西他们如何查找特定类所需的变量? – John

+0

我是一个.NET人,所以我可能错了,但我相信PHP DI框架的约定是使用参数名称。没有类型信息,这是他们唯一可以使用的。所以注册意味着按名称查找字典。 – Steven

相关问题