/
softailor
/
gridient
Обзор
Документация
Войти
/
softailor
/
gridient
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
backend/Gridient.Core/Extensions/UnitOfWorkExtensions.cs
68 строк
3 KB
Jenkins
Auto add
18 фев 2026, 10:19
18 фев 2026, 10:19
1e6c4f8
Код
Авторство
О чём код?
using Gridient.Core.Repositories; using Microsoft.Extensions.Logging; namespace Gridient.Core.Extensions { /// <summary> /// Extension-методы для IUnitOfWork для упрощения работы с транзакциями /// </summary> public static class UnitOfWorkExtensions { /// <summary> /// Выполняет действие в транзакции с автоматической обработкой commit/rollback и логированием ошибок /// </summary> /// <typeparam name="T">Тип возвращаемого значения</typeparam> /// <param name="unitOfWork">UnitOfWork для создания транзакции</param> /// <param name="action">Действие, которое нужно выполнить в транзакции</param> /// <param name="logger">Логгер для записи ошибок (опционально)</param> /// <param name="cancellationToken">Токен отмены</param> /// <returns>Результат выполнения действия</returns> public static async Task<T> ExecuteInTransactionAsync<T>( this IUnitOfWork unitOfWork, Func<IUnitOfWorkTransaction, Task<T>> action, ILogger? logger = null, CancellationToken cancellationToken = default) { await using var transaction = await unitOfWork.BeginTransactionAsync(cancellationToken); try { var result = await action(transaction); await transaction.CommitAsync(cancellationToken); return result; } catch (Exception ex) { logger?.LogError(ex, "Ошибка при выполнении транзакции"); await transaction.RollbackAsync(cancellationToken); throw; } } /// <summary> /// Выполняет действие в транзакции с автоматической обработкой commit/rollback и логированием ошибок /// </summary> /// <param name="unitOfWork">UnitOfWork для создания транзакции</param> /// <param name="action">Действие, которое нужно выполнить в транзакции</param> /// <param name="logger">Логгер для записи ошибок (опционально)</param> /// <param name="cancellationToken">Токен отмены</param> public static async Task ExecuteInTransactionAsync( this IUnitOfWork unitOfWork, Func<IUnitOfWorkTransaction, Task> action, ILogger? logger = null, CancellationToken cancellationToken = default) { await using var transaction = await unitOfWork.BeginTransactionAsync(cancellationToken); try { await action(transaction); await transaction.CommitAsync(cancellationToken); } catch (Exception ex) { logger?.LogError(ex, "Ошибка при выполнении транзакции"); await transaction.RollbackAsync(cancellationToken); throw; } } } }