using Sufi.Demo.PeopleDirectory.Application.Contracts.Repositories; using Sufi.Demo.PeopleDirectory.Domain.Common; using Sufi.Demo.PeopleDirectory.Persistence.Contexts; using System.Collections; namespace Sufi.Demo.PeopleDirectory.Persistence.Repositories { public class UnitOfWork( ApplicationDbContext dbContext ) : IUnitOfWork { private bool disposed; private Hashtable? _repositories; public IAsyncRepository Repository() where TEntity : AuditableEntity { _repositories ??= []; var type = typeof(TEntity).Name; if (!_repositories.ContainsKey(type)) { var repositoryType = typeof(AsyncRepository<,>); var repositoryInstance = Activator.CreateInstance(repositoryType.MakeGenericType(typeof(TEntity), typeof(TId)), dbContext); _repositories.Add(type, repositoryInstance); } return (IAsyncRepository)_repositories[type]!; } public async Task Commit(CancellationToken cancellationToken) { return await dbContext.SaveChangesAsync(cancellationToken); } public async Task CommitAndRemoveCache(CancellationToken cancellationToken, params string[] cacheKeys) { var result = await dbContext.SaveChangesAsync(cancellationToken); return result; } public Task Rollback() { dbContext.ChangeTracker.Entries().ToList().ForEach(x => x.Reload()); return Task.CompletedTask; } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!disposed) { if (disposing) { //dispose managed resources dbContext.Dispose(); } } //dispose unmanaged resources disposed = true; } } }