在我的控制器中注入了很多依赖项


Injecting a lot of dependencies in my controller

目前我只注入我的Request, SessionUserService类,其余的我只是在我需要它们的代码中实例化。

现在,我已经学会了总是使用依赖注入来松散耦合我的类和它的依赖项。在这种情况下,我真的需要注入所有这10个类并在构造函数参数中指定它们吗?

注册控制器(简化):

namespace Controllers;
use 'vHttp'Request;
use 'vHttp'Session;
use 'Models'Services'User;
use 'Libraries'Validator'Validator;
use 'Libraries'Validator'Rules'MaxChars;
use 'Libraries'Validator'Rules'Alpha;
use 'Libraries'Validator'Rules'Email;
use 'Libraries'Validator'Rules'Match;
use 'Libraries'Validator'Rules'MinChars;
use 'Libraries'CryptoCharGen;
class SignUp extends Controller
{
    private $session;
    public function __construct(Request $request, Session $session, UserService $userService)
    {
        parent::__construct($request, $userService);
        $this->session = $session;
    }
    public function index() {
        ...
    }
    public function submit() {
        ...
    }
}

默认情况下,您不必为所有内容注入依赖项。考虑一下将来可能需要更改哪些功能,或者用测试模拟哪些功能,然后注入这些功能。

如果你发现自己向构造函数传递了多个依赖项,请考虑你的类是否有太多的责任。考虑是否可以将依赖关系封装到参数对象中,或者找到另一种方法来减少长参数列表。

在使用依赖注入或任何其他设计模式时,您必须决定做出哪些权衡。一方面,它可以使您的设计更加灵活和松散耦合。另一方面,你真的需要额外的灵活性吗?如果使用不真正需要的设计模式,您将冒着浪费精力的风险。

如果我明白你在问什么,简单地说,没有。您必须只向构造函数传递类需要的参数。在这种情况下,我认为验证器可以不用传递给构造函数:

use 'Libraries'Validator'Rules'Email;
class Signup extends Controller
{
    private $emailValidator;
    public function __construct(Request $request, Session $session, UserService $userService)
    {
        parent::__construct($request, $userService);
        $this->session = $session;
        $this->emailValidator = new Email();
    }
}