доменный дизайн — DDD в PHP — & gt; Проектор — & gt; Где и когда следует вызывать метод регистрации проектора?

Я сейчас читаю о прогнозах из книги DDD в PHP и я запутался, когда и где вызывать метод register из класса проектора.

Поток: 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);
}
}
}
}

2

Решение

Есть множество способов сделать это. Однако, учитывая, что ваш Projector класс не является потокобезопасным, вы должны сделать это где-то нет споров. Я бы сделал это в Корень композиции моего приложения, прямо или косвенно, используя крюк запуска приложения, если таковой имеется.

Кроме того, чтобы минимизировать риск злоупотребления register функция Projector Я, вероятно, просто передам все прогнозы при построении Projector учебный класс. Это исключает риск звонка register в более позднее время возможно создание разногласий с продолжающимся project операция.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]