下面是一小段代码:
class Mail
{
public $subject;
public function send()
{
DI::get('mailer')->send($this);
}
}
class Mailer
{
public function send(Mail $mail)
{
//
}
}它不使用DI,我的意思是Mailer不是通过构造函数传递给Mail的,只是从容器中取出的。但是什么时候使用哪一个呢?
发布于 2016-09-06 19:02:41
使用IoC容器作为服务定位器is an Anti-Pattern。
你应该更喜欢构造函数注入而不是方法注入或属性注入:
如果类在没有依赖项的情况下无法完成工作,则将其添加到构造函数中。这个类需要新的依赖项,所以您希望您的更改能够破坏某些东西。此外,创建一个未完全初始化的类(“两步构造”)是一种反模式(IMHO)。如果类可以在没有依赖项的情况下工作,那么setter就可以了。- Source
对于给定的对象树,您的IoC容器应该只被访问一次。当我说accessed时,我指的是调用DI::get('X')。您的对象不应调用DI::get('X')。您的对象不应该知道IoC容器的存在。
只能从对象图的Composition Root访问IoC容器。
在MVC web应用程序中,组合根通常是一个控制器工厂。在控制台应用程序中,它可以在main中找到。
https://stackoverflow.com/questions/39333963
复制相似问题