首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >依赖注入/ LoD

依赖注入/ LoD
EN

Stack Overflow用户
提问于 2014-10-17 12:07:11
回答 1查看 170关注 0票数 0

我理解依赖注入的基本原则,但想要一些关于如何处理在其他类方法中实例化的类的建议;这与依赖注入模式背道而驰吗?

此外,我希望将对象(类)写入DB (mongo in object form),因此不希望它与其他依赖关系膨胀。

为了更好地解释我的意思,这里有一个例子:

假设我们有一个用户类被注入一个服务器类-

代码语言:javascript
复制
class User{
    public $user_id
    public $user_name;

    public function __construct(server $server){
        $this->server = $server;
    }

    public function delete(){
        //...delete user code

        // Send mail to user
        $mailer = new mailer($this->server);
        $mailer->sendMail();
    }

}

所以这有两件事

  1. 这意味着用户类现在会膨胀,因为它还包含服务器类。
  2. 这违反了德米特定律吗?因为User类实际上不需要Server类,而是将它传递给Mailer类。

我理解的一种方法是在从外部控制器调用时将mailer类注入delete函数,这意味着用户类永远不需要注入服务器类:

代码语言:javascript
复制
$server = new server();
$mailer = new mailer($server);
$user = new User();
$user->delete($mailer);

class User{
    public $user_id
    public $user_name;

    public function __construct(){
        // other code
    }

    public function delete(mailer $mailer){
        //...delete user code

        // Send mail to user          
        $mailer->sendMail();
    }

}

但是,这当然意味着您需要了解类中的方法所需的每个类,如果这种嵌套变得很深,这肯定很难跟踪。

此外,如果user->delete是一个私有方法,会发生什么情况?首先,您无法从外部控制器调用它来传递mailer对象。

所以我的问题是什么是最好的方式去做这件事?

EN

Stack Overflow用户

回答已采纳

发布于 2014-10-17 12:09:43

对我来说,依赖于一个对象是一种感觉,这样你就可以构造一个不同的对象。

相反,使用要构造的对象的依赖项。因此,在您的情况下,只需将一个mailer传递给您的User构造函数,那么您就不需要创建一个mailer,也不需要关心服务器。

在这里,您的User依赖于邮件程序(用于邮件),因此这就是应该注入的内容。

您的对象应该只创建叶对象/数据持有者/DTOs的新实例。任何提供任何功能(即服务)的东西都应该注入到需要使用该功能的对象中。

编辑

我不做PHP,但我认为您的用户类应该更像这样:

代码语言:javascript
复制
class User{
    public $user_id
    public $user_name;

    public function __construct(mailer $mailer){
        $this->mailer = $mailer;
    }

    public function delete(){
        //...delete user code

        // Send mail to user
        $this->mailer->sendMail();
    }    
}

至于通过构造函数和传递给方法的注入,这取决于当您的User用户想要删除一个用户时,期望他们提供一个邮件程序是否合理。对我来说,听起来并不是这样,所以我会通过构造函数传递它。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26424690

复制
相关文章

相似问题

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