如何注入 "unknown/dynamic" 依赖项
How to inject "unknown/dynamic" dependencies
我有以下通知实体:
如您所见,有一个名为 "objectId" 的字段,我想根据通知类型在其中存储相关的对象 ID。然后我将通知添加到电子邮件队列中。当队列得到处理时,我无法从特定服务 class 获取对象。例如:
- 通知类型 1:UserService::getUser($objectId)
- 通知类型 2:CompanyService::getCompany($objectId)
那么我怎样才能定义这种关系而不用添加越来越多的通知类型呢?注入所有需要的服务并通过数千个 "if this than that" 处理它感觉很糟糕 "if this than that" :)
如果您注入对象而不是 id,则无需在通知中调用其他服务来获取适当的实例。
如果Notification
不需要知道它使用的是什么类型的对象,只需要依赖User
和Company
实现的接口,并注入那些对象直接进入 Notification
.
例如:
interface EmailNotifiableEntity {
function getLabel()
function getEmailAddress()
}
class User implements EmailNotifiableEntity {
public function getLabel() {
return $this->getName() . " " . $this->getFullName();
}
public function getEmailAddress() {
return this->getEmailAddress();
}
}
class Company implements EmailNotifiableEntity {
public function getLabel() {
return $this->getCompanyName();
}
public function getEmailAddress() {
return this->getNotificationsEmail();
}
}
class Notification {
public function __construct(EmailNotifiableEntity $entity) {
$this->entity = $entity;
}
public function send() {
$address = $entity->getEmailAddress();
$label = $entity->getLabel();
// do your thing to send your notification
}
(实施有点简单,所以请根据需要进行构建)。这样,当您实例化 Notification
时,您会在不知道其具体种类的情况下注入依赖的实体。
我有以下通知实体:
如您所见,有一个名为 "objectId" 的字段,我想根据通知类型在其中存储相关的对象 ID。然后我将通知添加到电子邮件队列中。当队列得到处理时,我无法从特定服务 class 获取对象。例如:
- 通知类型 1:UserService::getUser($objectId)
- 通知类型 2:CompanyService::getCompany($objectId)
那么我怎样才能定义这种关系而不用添加越来越多的通知类型呢?注入所有需要的服务并通过数千个 "if this than that" 处理它感觉很糟糕 "if this than that" :)
如果您注入对象而不是 id,则无需在通知中调用其他服务来获取适当的实例。
如果Notification
不需要知道它使用的是什么类型的对象,只需要依赖User
和Company
实现的接口,并注入那些对象直接进入 Notification
.
例如:
interface EmailNotifiableEntity {
function getLabel()
function getEmailAddress()
}
class User implements EmailNotifiableEntity {
public function getLabel() {
return $this->getName() . " " . $this->getFullName();
}
public function getEmailAddress() {
return this->getEmailAddress();
}
}
class Company implements EmailNotifiableEntity {
public function getLabel() {
return $this->getCompanyName();
}
public function getEmailAddress() {
return this->getNotificationsEmail();
}
}
class Notification {
public function __construct(EmailNotifiableEntity $entity) {
$this->entity = $entity;
}
public function send() {
$address = $entity->getEmailAddress();
$label = $entity->getLabel();
// do your thing to send your notification
}
(实施有点简单,所以请根据需要进行构建)。这样,当您实例化 Notification
时,您会在不知道其具体种类的情况下注入依赖的实体。