我目前正在阅读PHP中的DDD一书中关于投影的内容,我很困惑何时何地从投影仪类调用寄存器方法。
Flow: CreateNewTaskRequest -> CreateNewTaskService -> Task::writeFromNew() -> PDOTaskRepository。
在PDOTaskRepository的保存方法的末尾,将调用投影仪的projector,然后该方法将调用侦听给定域事件的所有已注册投影的projector。
但我何时何地向投影仪注册投影呢?
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);
}
}
}
}发布于 2016-11-18 16:02:53
有多种方法可以做到这一点。但是,考虑到您的Projector类不是线程安全的,您必须在没有争用的地方这样做。我会在我的应用程序的成分根中直接或间接地利用应用程序启动钩子(如果有的话)。
此外,为了尽量减少有人滥用Projector的Projector函数的风险,在构造Projector类时,我可能只需传递所有的投影。这消除了以后调用register的风险,可能会与正在进行的project操作创建争用。
https://stackoverflow.com/questions/40664383
复制相似问题