依赖注入不需要的服务

时间:2019-10-23 13:01:52

标签: php dependency-injection

想象一下我们正在使用一些依赖注入,并且在某些控制器中使用它。

例如Laravel或任何其他具有DI的框架(在这种情况下,语言与PHP无关)。

假设我们有这个控制器:

class UserController extends Controller
{
    public function __construct(UserRepository $users, Mailer $mailer, Logger $logger)
    {
        $this->users = $users;
        $this->mailer = $mailer;
        $this->logger = $logger;       
    }
    public function method1(){...}
    public function method2(){...}
    public function index(UserRepository $users){...}
}

每个人都说这是很好的设计,但是我的问题是:

例如,如果控制器调用 method1 并且仅使用 mailer ,那么构造具有所有3个依赖项的对象的意义何在?即使不占用大量内存或性能,这也不是最佳选择吗?

有人可以认为此控制器需要所有这些控制器,但实际上,如果我仅调用 method1 ,则只需使用 mailer

>

如果我尝试对诸如“ index”方法之类的方法注入依赖项,那该怎么办,因为如果我扩展相同的方法并需要不同的依赖项,PHP将因方法签名不同而崩溃。

处理此问题的最佳方法是什么。

如果将每个方法提取到单独的控制器中,则必须重复很多次。

谢谢

1 个答案:

答案 0 :(得分:1)

有几件事要考虑:

  • 首先,当injection constructors are simple时,并不是所有的依赖项都一直使用,这没关系。这应该不会造成任何可衡量的性能损失,因为性能瓶颈通常是由I / O引起的。
  • 但是,如果您的类包含许多依赖项,并且有很多仅在某些方法中使用的依赖项,则可能表明该类上的方法不具有内聚性。这再次可能表明该类违反了单一责任原则。换句话说,该类可能太大,具有多个职责,如果是这样,则应将其分为多个较小的类。围绕实体概念对类功能进行分组(例如UserController)通常是违反SRP的原因。相反,更好的解决方案通常是围绕功能对类进行分组。例如DeleteUserControllerPromoteUserControllerBlockUserController