如何注入 "unknown/dynamic" 依赖项

How to inject "unknown/dynamic" dependencies

我有以下通知实体:

如您所见,有一个名为 "objectId" 的字段,我想根据通知类型在其中存储相关的对象 ID。然后我将通知添加到电子邮件队列中。当队列得到处理时,我无法从特定服务 class 获取对象。例如:

那么我怎样才能定义这种关系而不用添加越来越多的通知类型呢?注入所有需要的服务并通过数千个 "if this than that" 处理它感觉很糟糕 "if this than that" :)

如果您注入对象而不是 id,则无需在通知中调用其他服务来获取适当的实例。

如果Notification不需要知道它使用的是什么类型的对象,只需要依赖UserCompany实现的接口,并注入那些对象直接进入 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 时,您会在不知道其具体种类的情况下注入依赖的实体。