using ApplicationLayer.GeneralExceptions; using ApplicationLayer.InfrastructureServicesInterfaces; using Domains; using Microsoft.EntityFrameworkCore; namespace Infrastructure.Database.Generic; /// Generic repository pattern /// /// Type of entity /// Should be inherited to create typed repositories public abstract class GenericRepository(IGenericReader reader, IGenericWriter writer) : IGenericRepository where T : class, IEntity { /// public async Task> GetAllAsync(CancellationToken cancellationToken) => await LoadDomain().ToListAsync(cancellationToken); /// public async Task GetByIdAsync(Guid id, CancellationToken cancellationToken) { var result = await LoadDomain().SingleOrDefaultAsync(a => a.Id == id, cancellationToken); return result ?? throw new EntityNotFoundByIdException(id); } /// public async Task AddAsync(T entity, CancellationToken cancellationToken) => await writer.AddAsync(entity, cancellationToken); /// public async Task UpdateAsync(T entity, CancellationToken cancellationToken) { await GetByIdAsync(entity.Id, cancellationToken); writer.Update(entity); } /// public void Remove(T entity) { writer.Remove(entity); } /// Should be overriden to load navigation properties of entity protected virtual IQueryable LoadDomain() { return reader.GetAll(); } }