首页 > 解决方案 > 依赖注入不需要的服务

问题描述

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

例如 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并且它仅使用邮件程序,那么构造具有所有 3 个依赖项的对象的意义何在。即使它不占用大量内存或性能,这不是最优的吗?

有人可能会认为这个控制器需要所有这些,但实际上如果我只调用method1它只需要mailer

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

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

如果我在单独的控制器中提取每种方法,我将不得不做很多重复。

谢谢

标签: phpdependency-injection

解决方案


有几点需要考虑:

  • 首先,当注入构造函数很简单时,并非所有依赖项都一直使用并不重要。这不应导致任何可衡量的性能损失,因为性能瓶颈通常是由 I/O 引起的。
  • 但是,如果您的类包含许多依赖项,并且有许多仅在某些方法中使用的依赖项,则可能表明该类上的方法没有内聚性。这又可能表明该类违反了单一责任原则。换句话说,这个类可能太大了,有多个职责,如果是这样的话,它应该被分成多个更小的类。围绕实体的概念(例如 dos UserController)对类功能进行分组通常是违反 SRP 的原因。相反,更好的解决方案通常是围绕功能对类进行分组。例如DeleteUserController, PromoteUserController,BlockUserController等。

推荐阅读