PHP中的DDD - >投影机 - >何时何地应该调用投影机的注册方法?

问题描述:

我正在阅读关于书籍DDD in PHP的预测,我很困惑何时何地从投影仪类中调用注册方法。PHP中的DDD - >投影机 - >何时何地应该调用投影机的注册方法?

Flow: CreateNewTaskRequest - > CreateNewTaskService - > Task :: writeFromNew() - > PDOTaskRepository。

在PDOTaskRepository的保存方法结束时,调用投影仪的项目方法,这反过来会调用正在监听给定域事件的所有已注册投影的项目方法。

但是何时何地向投影仪注册投影?

class PDOTaskRepository implements TaskRepository 
{ 
    private $projector; 

    public function __construct(Projector $projector) 
    { 
     $this->projector = $projector; 
    } 

    public function save(Task $task) 
    { 
     // Code to save in DB 


     $this->projector->project($task->recordedEvents()); 
    } 
} 


class Projector 
{ 
    /** 
    * @var Projection[] 
    */ 
    private $projections = []; 


    /** 
    * @param Projection[] $projections 
    */ 
    public function register(array $projections) 
    { 
     foreach ($projections as $projection) { 
      $this->projections[$projection->listensTo()] = $projection; 
     } 
    } 

    public function project(array $events) 
    { 
     foreach ($events as $event) { 
      if (isset($this->projections[get_class($event)])) { 
       $this->projections[get_class($event)]->project($event); 
      } 
     } 
    } 
} 
+0

你正在寻找的东西是pub/sub模式。 – Dariss

+0

这些同步投影是? – plalx

+0

@plalx是的,它是同步的 –

有很多方法可以做到这一点。但是,鉴于您的类不是线程安全的,您必须在没有争用的地方执行此操作。我会在我的应用程序的Composition Root中直接或通过利用应用程序启动挂钩(如果有的话)直接或间接地执行此操作。

此外,为了最大限度地减少有人滥用Projectorregister函数的风险,我可能会在构造Projector类时通过所有投影。这消除了稍后有人呼叫register可能与正在进行的project操作产生争用的风险。