using Microsoft.EntityFrameworkCore.Storage; using MyNewProjectName.Domain.Interfaces; using MyNewProjectName.Infrastructure.Persistence.Context; namespace MyNewProjectName.Infrastructure.Persistence.Repositories; /// /// Unit of Work implementation /// public class UnitOfWork : IUnitOfWork { private readonly ApplicationDbContext _context; private IDbContextTransaction? _transaction; public UnitOfWork(ApplicationDbContext context) { _context = context; } public async Task SaveChangesAsync(CancellationToken cancellationToken = default) { return await _context.SaveChangesAsync(cancellationToken); } public async Task BeginTransactionAsync(CancellationToken cancellationToken = default) { _transaction = await _context.Database.BeginTransactionAsync(cancellationToken); } public async Task CommitTransactionAsync(CancellationToken cancellationToken = default) { try { await _context.SaveChangesAsync(cancellationToken); if (_transaction != null) { await _transaction.CommitAsync(cancellationToken); } } catch { await RollbackTransactionAsync(cancellationToken); throw; } finally { if (_transaction != null) { await _transaction.DisposeAsync(); _transaction = null; } } } public async Task RollbackTransactionAsync(CancellationToken cancellationToken = default) { if (_transaction != null) { await _transaction.RollbackAsync(cancellationToken); await _transaction.DisposeAsync(); _transaction = null; } } public void Dispose() { _transaction?.Dispose(); _context.Dispose(); } }