初始化注入依赖项的最佳实践


Best practice for initializing an injected dependency?

我有一个EmailProvider我通过我的构造函数注入。在运行时,它需要用主机、端口等初始化。这些设置可以根据不同的用户输入而改变。初始化注入依赖的最佳实践方法是什么?

我应该注入一个抽象接口与创建方法?这个create方法接受初始化参数?

class DataProvider {
  private $emailProvider;
  public function __construct(EmailProvider $emailProvider) {
    $this->emailProvider = $emailProvider;
  }
  public function getEmails($args) {
    $this->emailProvider->initialize($args['host'], $args['port']);  // bad?
    return $this->emailProvider->getAll();
  }
}

要进行一些初始化,您可以使用singleton()调用与闭包绑定您的提供商到容器:

App::singleton(EmailProvider::class, function() {
    return new EmailProvider(config('email.host'), config('email.port'));
});

这个调用应该位于一些应用程序提供者(App'Providers名称空间)