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);
}
}
}
}
答
有很多方法可以做到这一点。但是,鉴于您的类不是线程安全的,您必须在没有争用的地方执行此操作。我会在我的应用程序的Composition Root中直接或通过利用应用程序启动挂钩(如果有的话)直接或间接地执行此操作。
此外,为了最大限度地减少有人滥用Projector
的register
函数的风险,我可能会在构造Projector
类时通过所有投影。这消除了稍后有人呼叫register
可能与正在进行的project
操作产生争用的风险。
你正在寻找的东西是pub/sub模式。 – Dariss
这些同步投影是? – plalx
@plalx是的,它是同步的 –