接口依赖注入



我正在围绕接口和依赖注入进行思考。到目前为止,我了解接口的实现功能,但是我错过了一些东西,并且在花费大量时间阅读和观看视频后无法通过它。 我有一个很好的例子,它使用不同的邮件服务,如PHPMailer或OtherMailerService,它们是第三方库。我不是从我的类(SomeClass(中实例化邮件服务,而是将一个实例注入到构造函数中,为了使其灵活,我将使用接口。

<?php
interface MailerInterface {
public function send($message);
}

我现在可以键入提示我的类的构造函数参数来保护我的类。

<?php
class SomeClass{
public $mailer;
public function __construct(MailerInterface $mailer) { 
$this->mailer = $mailer;
}
public function sendMailMessage() 
{
$mailer->send($message);
}
}

现在这个邮件接口需要在邮件服务中实现,但这是第三方。而且我还需要将该函数 send(( 实现到第三方中,这感觉我的想法不对。我花了很多时间试图理解这个概念,但它从我的脑海中溜走了。

我没有清楚地看到这一点,所以我的问题是我将如何为依赖项注入设置我的第三方库?缺少什么?

您无法获得第三方库来实现您的接口,因此您需要编写一些包装类,例如

use PHPMailerPHPMailerPHPMailer;
class PHPMailerWrapper implements MailerInterface {
private $mail;
public function __construct(PHPMailer $mail) {
$this->mail = $mail;
// mailer could be configured here or prior to being passed in here
}
public function send($message) {
// super simple example, I don't know PHPMailer very well
$this->mail->body = $message;
return $this->mail->send();
}
}

您需要对希望支持的任何其他实现执行类似操作。

然后,您将创建其中一个实现的实例并将其传递给您的SomeClass构造函数,例如

$mailer = new PHPMailerWrapper($phpMailerInstance);
$someObj = new SomeClass($mailer);

最新更新