Changed models, added Application layer models
This commit is contained in:
		| @@ -2,52 +2,51 @@ | ||||
| using Infrastructure.Database.GeneralExceptions; | ||||
| using Microsoft.EntityFrameworkCore; | ||||
|  | ||||
| namespace Infrastructure.Database.Generic | ||||
| namespace Infrastructure.Database.Generic; | ||||
|  | ||||
| /// Generic repository pattern | ||||
| /// <param name="writer"><inheritdoc cref="IGenericWriter"/></param> | ||||
| /// <param name="unitOfWork"><inheritdoc cref="IUnitOfWork"/></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, IUnitOfWork unitOfWork) : IGenericRepository<T> | ||||
|     where T : class, IEntity | ||||
| { | ||||
|     /// Generic repository pattern | ||||
|     /// <param name="writer"><inheritdoc cref="IGenericWriter"/></param> | ||||
|     /// <param name="unitOfWork"><inheritdoc cref="IUnitOfWork"/></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, IUnitOfWork unitOfWork) : 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}.GetOneAsync"/> | ||||
|     public async Task<T> GetOneAsync(Guid id, CancellationToken cancellationToken) | ||||
|     { | ||||
|         /// <inheritdoc cref="IGenericRepository{T}.GetAllAsync"/> | ||||
|         public async Task<List<T>> GetAllAsync(CancellationToken cancellationToken) | ||||
|             => await LoadDomain().ToListAsync(cancellationToken); | ||||
|  | ||||
|         /// <inheritdoc cref="IGenericRepository{T}.GetOneAsync"/> | ||||
|         public async Task<T> GetOneAsync(Guid id, CancellationToken cancellationToken) | ||||
|         { | ||||
|             var result = await LoadDomain().SingleOrDefaultAsync(a => a.Id == id, cancellationToken); | ||||
|             return result ?? throw new EntityNotFoundException<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 GetOneAsync(entity.Id, cancellationToken); | ||||
|             writer.Update(entity); | ||||
|         } | ||||
|  | ||||
|         /// <inheritdoc cref="IGenericRepository{T}.Remove"/> | ||||
|         public void Remove(T entity) | ||||
|         { | ||||
|             writer.Remove(entity); | ||||
|         } | ||||
|  | ||||
|         /// <inheritdoc cref="IGenericRepository{T}.SaveAsync"/> | ||||
|         public async Task SaveAsync(CancellationToken cancellationToken) | ||||
|             => await unitOfWork.SaveAsync(cancellationToken); | ||||
|  | ||||
|         /// Should be overriden to load navigation properties of entity | ||||
|         protected virtual IQueryable<T> LoadDomain() | ||||
|         { | ||||
|             return reader.GetAll<T>(); | ||||
|         } | ||||
|         var result = await LoadDomain().SingleOrDefaultAsync(a => a.Id == id, cancellationToken); | ||||
|         return result ?? throw new EntityNotFoundException<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 GetOneAsync(entity.Id, cancellationToken); | ||||
|         writer.Update(entity); | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc cref="IGenericRepository{T}.Remove"/> | ||||
|     public void Remove(T entity) | ||||
|     { | ||||
|         writer.Remove(entity); | ||||
|     } | ||||
|  | ||||
|     /// <inheritdoc cref="IGenericRepository{T}.SaveAsync"/> | ||||
|     public async Task SaveAsync(CancellationToken cancellationToken) | ||||
|         => await unitOfWork.SaveAsync(cancellationToken); | ||||
|  | ||||
|     /// Should be overriden to load navigation properties of entity | ||||
|     protected virtual IQueryable<T> LoadDomain() | ||||
|     { | ||||
|         return reader.GetAll<T>(); | ||||
|     } | ||||
| } | ||||
| @@ -1,12 +1,11 @@ | ||||
| using Domains; | ||||
|  | ||||
| namespace Infrastructure.Database.Generic | ||||
| namespace Infrastructure.Database.Generic; | ||||
|  | ||||
| /// Reads from data storage | ||||
| public interface IGenericReader | ||||
| { | ||||
|     /// Reads from data storage | ||||
|     public interface IGenericReader | ||||
|     { | ||||
|         /// Get all entities of type T stored in storage | ||||
|         /// <typeparam name="T">Entity type to seek in storage</typeparam> | ||||
|         IQueryable<T> GetAll<T>() where T : class, IEntity; | ||||
|     } | ||||
| } | ||||
|     /// Get all entities of type T stored in storage | ||||
|     /// <typeparam name="T">Entity type to seek in storage</typeparam> | ||||
|     IQueryable<T> GetAll<T>() where T : class, IEntity; | ||||
| } | ||||
| @@ -1,37 +1,36 @@ | ||||
| using Domains; | ||||
|  | ||||
| namespace Infrastructure.Database.Generic | ||||
| namespace Infrastructure.Database.Generic; | ||||
|  | ||||
| /// <summary> | ||||
| /// Generic repository pattern | ||||
| /// </summary> | ||||
| /// <typeparam name="T">Entity type</typeparam> | ||||
| public interface IGenericRepository<T> where T : class, IEntity | ||||
| { | ||||
|     /// Get all entities from data storage | ||||
|     Task<List<T>> GetAllAsync(CancellationToken cancellationToken); | ||||
|  | ||||
|     /// Get one entity with specific id | ||||
|     /// <param name="id">Identifier of entity</param> | ||||
|     Task<T> GetOneAsync(Guid id, CancellationToken cancellationToken); | ||||
|  | ||||
|     /// Add entity to storage | ||||
|     /// <param name="entity">Entity to add</param> | ||||
|     Task AddAsync(T entity, CancellationToken cancellationToken); | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Generic repository pattern | ||||
|     /// Update entity in storage | ||||
|     /// </summary> | ||||
|     /// <typeparam name="T">Entity type</typeparam> | ||||
|     public interface IGenericRepository<T> where T : class, IEntity | ||||
|     { | ||||
|         /// Get all entities from data storage | ||||
|         Task<List<T>> GetAllAsync(CancellationToken cancellationToken); | ||||
|     /// <param name="entity">Entity to update</param> | ||||
|     Task UpdateAsync(T entity, CancellationToken cancellationToken); | ||||
|  | ||||
|         /// Get one entity with specific id | ||||
|         /// <param name="id">Identifier of entity</param> | ||||
|         Task<T> GetOneAsync(Guid id, CancellationToken cancellationToken); | ||||
|     /// <summary> | ||||
|     /// Remove entity from storage | ||||
|     /// </summary> | ||||
|     /// <param name="entity">Entity to remove</param> | ||||
|     void Remove(T entity); | ||||
|  | ||||
|         /// Add entity to storage | ||||
|         /// <param name="entity">Entity to add</param> | ||||
|         Task AddAsync(T entity, CancellationToken cancellationToken); | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Update entity in storage | ||||
|         /// </summary> | ||||
|         /// <param name="entity">Entity to update</param> | ||||
|         Task UpdateAsync(T entity, CancellationToken cancellationToken); | ||||
|  | ||||
|         /// <summary> | ||||
|         /// Remove entity from storage | ||||
|         /// </summary> | ||||
|         /// <param name="entity">Entity to remove</param> | ||||
|         void Remove(T entity); | ||||
|  | ||||
|         /// Save changes in storage | ||||
|         Task SaveAsync(CancellationToken cancellationToken); | ||||
|     } | ||||
| } | ||||
|     /// Save changes in storage | ||||
|     Task SaveAsync(CancellationToken cancellationToken); | ||||
| } | ||||
| @@ -1,25 +1,24 @@ | ||||
| using Domains; | ||||
|  | ||||
| namespace Infrastructure.Database.Generic | ||||
| namespace Infrastructure.Database.Generic; | ||||
|  | ||||
| /// Writes data to data storage | ||||
| /// <remarks><see cref="IUnitOfWork"/> should be used to save changes</remarks> | ||||
| public interface IGenericWriter | ||||
| { | ||||
|     /// Writes data to data storage | ||||
|     /// <remarks><see cref="IUnitOfWork"/> should be used to save changes</remarks> | ||||
|     public interface IGenericWriter | ||||
|     { | ||||
|         /// Add entity to data storage | ||||
|         /// <param name="entity">Entity to add</param> | ||||
|         /// <param name="cancellationToken">Cancellation Token</param> | ||||
|         /// <typeparam name="T">Entity type</typeparam> | ||||
|         Task AddAsync<T>(T entity, CancellationToken cancellationToken) where T : class, IEntity; | ||||
|     /// Add entity to data storage | ||||
|     /// <param name="entity">Entity to add</param> | ||||
|     /// <param name="cancellationToken">Cancellation Token</param> | ||||
|     /// <typeparam name="T">Entity type</typeparam> | ||||
|     Task AddAsync<T>(T entity, CancellationToken cancellationToken) where T : class, IEntity; | ||||
|  | ||||
|         /// Update entity in data storage | ||||
|         /// <param name="entity">Entity to update</param> | ||||
|         /// <typeparam name="T">Entity type</typeparam> | ||||
|         void Update<T>(T entity) where T : class, IEntity; | ||||
|     /// Update entity in data storage | ||||
|     /// <param name="entity">Entity to update</param> | ||||
|     /// <typeparam name="T">Entity type</typeparam> | ||||
|     void Update<T>(T entity) where T : class, IEntity; | ||||
|  | ||||
|         /// Remove entity from data storage | ||||
|         /// <param name="entity">Entity to remove</param> | ||||
|         /// <typeparam name="T">Entity type</typeparam> | ||||
|         void Remove<T>(T entity) where T : class, IEntity; | ||||
|     } | ||||
| } | ||||
|     /// Remove entity from data storage | ||||
|     /// <param name="entity">Entity to remove</param> | ||||
|     /// <typeparam name="T">Entity type</typeparam> | ||||
|     void Remove<T>(T entity) where T : class, IEntity; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user