依赖注入/ LoD

我理解依赖注入的基本原则,但希望了解如何处理其他类方法中实例化的类; 这是否违背了依赖注入模式?

此外,我想写对象(类)到数据库(对象形式的mongo),所以不希望它与其他依赖关系臃肿。

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

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

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();
    }

}

所以有两件事

  • 这意味着User类现在变得臃肿,因为它也包含服务器类
  • 这是否违反了德米特法? 由于User类实际上并不需要Server类而不是传递给Mailer类。
  • 我知道解决这个问题的方法是在从外部控制器调用时将邮件程序类注入到删除函数中,这意味着用户类永远不必注入服务器类:

    $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的构造函数,那么你不需要创建一个邮件程序,也不需要关心服务器。

    在这里你的User对邮件程序有依赖性(做邮件),所以这是应该注入的东西。

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

    编辑

    我不做PHP,但我认为你的用户类应该看起来更像这样:

    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在想要删除用户时提供邮件程序是否合理。 对我来说听起来并不像它,所以我会通过构造函数传递它。

    链接地址: http://www.djcxy.com/p/14437.html

    上一篇: Dependency Injection / LoD

    下一篇: Going bananas with loose coupling and dependency injection