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