Разбираюсь с DDD и не могу понять, кто производит действия над агрегатами. В частности, например, действие отражающие "удаление" агрегата.
Например, существует агрегат Каталог товаров (Catalog) с корневой сущностью Catalog и объектами-значениями CatalogID, Name.
Есть хранилище, используя которое можем вытащить агрегат, изменить его и сохранить обратно
$catalog = $repository->find($catalogId);
$catalog->rename('Some another name')
$repository->update($catalog);
Также в рамках другого ограниченного контекста, существуют агрегат Интеграция (Integration), с корневой сущностью Integration, объектами значениями IntegrationId, Name и коллекцией объектов значений EntityRelations. С помощью этого агрегата у нас есть возможность связать нашу любую сущность из предметной области с сущностью стороннего интегрируемого сервиса (ERP, 1C)
...
$integration->addRelation(new EntityRelation('catalog', $catalog->id(), $externalCatalogId));
$integrationRepository->update($integration);
И теперь собственно вопрос, как мне "удалить" каталог таким образом, чтобы он "удалился" вместе со всеми интеграционными связями? Очевидно, можно ввести событие "CatalogDeleted", подписаться на него и "удалять" связанные с этим каталогом интеграционные связи. Но как Catalog узнает, что он "удаляется"?
Есть идея внутри сущности Catalog объявить защищенный метод onDelete(), и в хранилище через рефлексию его дергать.
class Catalog extends AbstractEntity
{
   ...
   protected function onDelete()
   {
       $eventManager->dispatch(new CatalogDeleted($this->id()));
   }
   ...
}
class CatalogRepository extends AbstractRepository implements CatalogRepositoryInterface
{
   ...
   public function delete(Catalog $catalog)
   {
        $method = new \ReflectionMethod($catalog, 'onDelete');
        $method->setAccessible(true);
        $method->invoke($catalog);
        //дальше удаляем из БД
   }
   ...
}
Можно ли считать такой подход нормальным?