首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PHP投影仪-> ->中,何时何地应该调用投影机的注册方法?

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

Stack Overflow用户
提问于 2016-11-17 20:26:51
回答 1查看 815关注 0票数 2

我目前正在阅读PHP中的DDD一书中关于投影的内容,我很困惑何时何地从投影仪类调用寄存器方法。

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

在PDOTaskRepository的保存方法的末尾,将调用投影仪的projector,然后该方法将调用侦听给定域事件的所有已注册投影的projector。

但我何时何地向投影仪注册投影呢?

代码语言:javascript
复制
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);
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2016-11-18 16:02:53

有多种方法可以做到这一点。但是,考虑到您的Projector类不是线程安全的,您必须在没有争用的地方这样做。我会在我的应用程序的成分根中直接或间接地利用应用程序启动钩子(如果有的话)。

此外,为了尽量减少有人滥用ProjectorProjector函数的风险,在构造Projector类时,我可能只需传递所有的投影。这消除了以后调用register的风险,可能会与正在进行的project操作创建争用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40664383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档