【问题标题】:Injecting a lot of dependencies in my controller在我的控制器中注入大量依赖项
【发布时间】:2014-08-04 20:19:07
【问题描述】:

目前我只注入我的RequestSessionUserService 类,其余的我只是在我需要的地方在我的代码中实例化。

现在,我学会了总是使用依赖注入来松散地耦合我的类和它的依赖。在那种情况下,我真的需要注入所有这 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() {
        ...
    }
}

【问题讨论】:

    标签: php dependency-injection controller dependencies


    【解决方案1】:

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

    如果您发现自己将多个依赖项传递给构造函数,请考虑您的类是否有太多职责。考虑是否可以将依赖项封装到参数对象中,或者找到另一种方法来减少 long parameter list

    您必须决定在使用依赖注入或任何其他设计模式时做出哪些权衡。一方面,它可能使您的设计更加灵活和松耦合。另一方面,您真的需要这种额外的灵活性吗?通过在没有真正需要的情况下使用设计模式,您冒着浪费精力的风险。

    【讨论】:

      【解决方案2】:

      如果我明白你在问什么,简而言之,不。您只需将类需要的参数传递给构造函数。在这种情况下,我认为可以使用验证器而不将它们传递给构造函数:

      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();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-01
        • 1970-01-01
        • 2015-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多