using GamificationService.Models.Database; using Microsoft.EntityFrameworkCore.Storage; namespace GamificationService.Database.Repositories; public class UnitOfWork : IDisposable { #region fields private ApplicationContext _context; private GenericRepository _userProfileRepository; private GenericRepository _roleRepository; private GenericRepository _rightRepository; private GenericRepository _refreshTokenRepository; private GenericRepository _roleRightRepository; private GenericRepository _userRoleRepository; private GenericRepository _instructionRepository; private GenericRepository _instructionParagraphRepository; private GenericRepository _instructionCategoryRepository; private GenericRepository _instructionTestRepository; private GenericRepository _instructionTestQuestionRepository; private GenericRepository _instructionTestResultRepository; #endregion private IDbContextTransaction _transaction; public UnitOfWork(ApplicationContext context) { _context = context; } #region Properties public GenericRepository UserProfileRepository { get { if (this._userProfileRepository == null) { this._userProfileRepository = new GenericRepository(_context); } return _userProfileRepository; } } public GenericRepository RoleRepository { get { if (this._roleRepository == null) { this._roleRepository = new GenericRepository(_context); } return _roleRepository; } } public GenericRepository RightRepository { get { if (this._rightRepository == null) { this._rightRepository = new GenericRepository(_context); } return _rightRepository; } } public GenericRepository RefreshTokenRepository { get { if (this._refreshTokenRepository == null) { this._refreshTokenRepository = new GenericRepository(_context); } return _refreshTokenRepository; } } public GenericRepository RoleRightRepository { get { if (this._roleRightRepository == null) { this._roleRightRepository = new GenericRepository(_context); } return _roleRightRepository; } } public GenericRepository UserRoleRepository { get { if (this._userRoleRepository == null) { this._userRoleRepository = new GenericRepository(_context); } return _userRoleRepository; } } public GenericRepository InstructionRepository { get { if (this._instructionRepository == null) { this._instructionRepository = new GenericRepository(_context); } return _instructionRepository; } } public GenericRepository InstructionParagraphRepository { get { if (this._instructionParagraphRepository == null) { this._instructionParagraphRepository = new GenericRepository(_context); } return _instructionParagraphRepository; } } public GenericRepository InstructionCategoryRepository { get { if (this._instructionCategoryRepository == null) { this._instructionCategoryRepository = new GenericRepository(_context); } return _instructionCategoryRepository; } } public GenericRepository InstructionTestRepository { get { if (this._instructionTestRepository == null) { this._instructionTestRepository = new GenericRepository(_context); } return _instructionTestRepository; } } public GenericRepository InstructionTestQuestionRepository { get { if (this._instructionTestQuestionRepository == null) { this._instructionTestQuestionRepository = new GenericRepository(_context); } return _instructionTestQuestionRepository; } } public GenericRepository InstructionTestResultRepository { get { if (this._instructionTestResultRepository == null) { this._instructionTestResultRepository = new GenericRepository(_context); } return _instructionTestResultRepository; } } #endregion public bool Save() { return _context.SaveChanges() > 0; } public async Task SaveAsync() { return await _context.SaveChangesAsync() > 0; } private bool disposed = false; protected virtual void Dispose(bool disposing) { if (!this.disposed) { if (disposing) { _context.Dispose(); } } this.disposed = true; } public async Task BeginTransactionAsync() { if (_transaction is not null) throw new InvalidOperationException("A transaction has already been started."); _transaction = await _context.Database.BeginTransactionAsync(); } public async Task CommitAsync() { if (_transaction is null) throw new InvalidOperationException("A transaction has not been started."); try { await _transaction.CommitAsync(); _transaction.Dispose(); _transaction = null; } catch (Exception) { if (_transaction is not null) await _transaction.RollbackAsync(); throw; } } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } }