php - 依赖注入不需要的服务
问题描述
想象一下,我们正在使用一些依赖注入,并且我们在一些控制器中使用它。
例如 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 会因为方法签名不同而崩溃。
处理此问题的最佳方法是什么。
如果我在单独的控制器中提取每种方法,我将不得不做很多重复。
谢谢
解决方案
有几点需要考虑:
- 首先,当注入构造函数很简单时,并非所有依赖项都一直使用并不重要。这不应导致任何可衡量的性能损失,因为性能瓶颈通常是由 I/O 引起的。
- 但是,如果您的类包含许多依赖项,并且有许多仅在某些方法中使用的依赖项,则可能表明该类上的方法没有内聚性。这又可能表明该类违反了单一责任原则。换句话说,这个类可能太大了,有多个职责,如果是这样的话,它应该被分成多个更小的类。围绕实体的概念(例如 dos
UserController
)对类功能进行分组通常是违反 SRP 的原因。相反,更好的解决方案通常是围绕功能对类进行分组。例如DeleteUserController
,PromoteUserController
,BlockUserController
等。
推荐阅读
- python - 矩阵乘法返回错误的矩阵python并行
- swift - 设置属性 P 后需要调用方法 M
- c# - EWS HttpHeader 内容类型
- wordpress - Woocommerce 显示产品组合而不选择所有组合
- jmeter - JMeter 一台机器可以同时运行多少个并发用户
- javascript - 使用 Jquery 基于复选框选择更有效地添加和删除类
- javascript - 是否有 JavaScript 方法可以复制 Focus-on-next-element (Tab) 行为?
- jasper-reports - 如何调整波段高度(拉伸和“收缩”)以使报告占据整个页面?
- python - 如何使用 Selenium 和 Python 更改此日历中的日期?
- wiremock - 按请求的主体映射使用两个匹配项