DDD Transactions in Application Service?

Добрый день я не эксперт в DDD и не понимаю всех тонкостей, подскажите пожалуйста как реализовывается запуск транзакций в Application Service?
Имеется структура:
src-
    - Module1
          - Application
               - BooService
               - FooService
          - Domain
             - Repository
                   - MyModelRepositoryInterface
          - Infrastructure
               - ExampleCommand
               - Repository
                   - MyModelRepository
    - Module2
          - Application
          - Domain
          - Infrastructure


Запускается выполнение команды \App\Module1\Infrastructure\ExampleCommand
который в свою очередь запускает сервис \App\Module1\Application\BooService
он обращается к репозиторию MyModelRepository и к сервису FooService получает какие то абстрактные данные и потом создаётся объект и сохраняется.

Каким образом реализовывается транзакция в этом сервисе? и вообще возможно ли она тут или нужно как то иначе архитектуру построить?
На ум приходит либо какой то сервис TransactionService на уровне Infrastructure с интерфейсом в Domain или работа через Events.
class BooService 
{
    public function execute()
    {

        //Transaction start
        
        $result = $this->fooService->execute();
        $this->myModelRepository->add(new MyModel($result->foo, $result->boo));

        //Transaction finish
        
        return true;
    }

}
  • Вопрос задан
  • 343 просмотра
Пригласить эксперта
Ответы на вопрос 1
@ivan_k11
Транзакции это уровень инфраструктуры
" с интерфейсом в Domain" домен про транзакции нечего знать не должен.

Можно предложить такое решение
Application
$repository->transactional(
            static function () use (
                $repository
            ) {
                $repository->save($entity);
                //и прочее сохранение данных
            }
        );


А в инфраструктуре реализовать метод
public function transactional(\closure $func)
    {
        $db_connection = getDbConnection();
        $db_connection->startTransaction();
        $func();
        $db_connection->commitTransaction();
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы