Php 依赖注入不需要的服务
假设我们正在使用依赖项注入,并在一些控制器中使用它 例如,Laravel或任何其他具有DI的框架(在本例中,PHP的语言并不重要) 假设我们有一个控制器:Php 依赖注入不需要的服务,php,dependency-injection,Php,Dependency Injection,假设我们正在使用依赖项注入,并在一些控制器中使用它 例如,Laravel或任何其他具有DI的框架(在本例中,PHP的语言并不重要) 假设我们有一个控制器: class UserController extends Controller { public function __construct(UserRepository $users, Mailer $mailer, Logger $logger) { $this->users = $users;
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将崩溃,因为方法签名不相同
最好的处理方法是什么
如果我在单独的控制器中提取每个方法,我将不得不进行大量重复
谢谢有几件事需要考虑:
- 首先,在什么时候,不是所有依赖项都一直被使用并不重要。这不会导致任何可测量的性能损失,因为性能瓶颈通常是由I/O造成的
- 但是,如果您的类包含许多依赖项,并且有许多依赖项仅在某些方法中使用,则可能表明类上的方法没有内聚性。这可能再次表明该类别违反了单一责任原则。换句话说,这个类可能太大,有多个职责,如果是这样的话,它应该被分成多个较小的类。围绕实体概念对类功能进行分组(例如
does)通常是SRP违规的原因。相反,更好的解决方案通常是围绕功能对类进行分组;e、 g.UserController
,DeleteUserController
,PromoteUserController
等BlockUserController