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;
    }

}
  • Вопрос задан
  • 571 просмотр
Пригласить эксперта
Ответы на вопрос 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();
    }
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
24 апр. 2024, в 19:51
1000 руб./за проект
24 апр. 2024, в 19:40
5000 руб./за проект
24 апр. 2024, в 19:18
50000 руб./за проект