首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DI还是DI/Service Locator容器?

DI还是DI/Service Locator容器?
EN

Stack Overflow用户
提问于 2016-09-05 23:45:05
回答 1查看 303关注 0票数 0

下面是一小段代码:

代码语言:javascript
复制
class Mail
{
    public $subject;

    public function send()
    {
        DI::get('mailer')->send($this);
    }
}

class Mailer
{
    public function send(Mail $mail)
    {
        //
    }
}

它不使用DI,我的意思是Mailer不是通过构造函数传递给Mail的,只是从容器中取出的。但是什么时候使用哪一个呢?

EN

回答 1

Stack Overflow用户

发布于 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中找到。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39333963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档