72 lines
1.9 KiB
C#
72 lines
1.9 KiB
C#
using Microsoft.EntityFrameworkCore.Storage;
|
|
using MyNewProjectName.Domain.Interfaces;
|
|
using MyNewProjectName.Infrastructure.Persistence.Context;
|
|
|
|
namespace MyNewProjectName.Infrastructure.Persistence.Repositories;
|
|
|
|
/// <summary>
|
|
/// Unit of Work implementation
|
|
/// </summary>
|
|
public class UnitOfWork : IUnitOfWork
|
|
{
|
|
private readonly ApplicationDbContext _context;
|
|
private IDbContextTransaction? _transaction;
|
|
|
|
public UnitOfWork(ApplicationDbContext context)
|
|
{
|
|
_context = context;
|
|
}
|
|
|
|
public async Task<int> 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();
|
|
}
|
|
}
|