Browse Source

Refactor EfCoreRepository and Repository base classes.

pull/81/head
Halil İbrahim Kalkan 10 years ago
parent
commit
7f15e4a878
  1. 2
      src/AbpDesk/AbpDesk.Application/AbpDesk/Tickets/TicketAppService.cs
  2. 61
      src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Repositories/EntityFrameworkCore/EfCoreRepository.cs
  3. 6
      src/Volo.Abp/Volo/Abp/Domain/Repositories/IQueryableRepository.cs
  4. 4
      src/Volo.Abp/Volo/Abp/Domain/Repositories/IRepository.cs
  5. 44
      src/Volo.Abp/Volo/Abp/Domain/Repositories/QueryableRepositoryBase.cs
  6. 28
      src/Volo.Abp/Volo/Abp/Domain/Repositories/RepositoryBase.cs
  7. 3
      src/Volo.Abp/project.json

2
src/AbpDesk/AbpDesk.Application/AbpDesk/Tickets/TicketAppService.cs

@ -17,7 +17,7 @@ namespace AbpDesk.Tickets
public ListResultDto<TicketDto> GetAll() public ListResultDto<TicketDto> GetAll()
{ {
var tickets = _ticketRepository var tickets = _ticketRepository
.GetAllList() .GetList()
.Select(t => new TicketDto { Id = t.Id, Title = t.Title, Body = t.Body }) .Select(t => new TicketDto { Id = t.Id, Title = t.Title, Body = t.Body })
.ToList(); .ToList();

61
src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Repositories/EntityFrameworkCore/EfCoreRepository.cs

@ -1,5 +1,7 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Volo.Abp.Domain.Entities; using Volo.Abp.Domain.Entities;
@ -8,9 +10,9 @@ using Volo.Abp.EntityFrameworkCore;
namespace Volo.Abp.Repositories.EntityFrameworkCore namespace Volo.Abp.Repositories.EntityFrameworkCore
{ {
//TODO: Override async versions //TODO: Override async versions and others
public class EfCoreRepository<TDbContext, TEntity, TPrimaryKey> : RepositoryBase<TEntity, TPrimaryKey> public class EfCoreRepository<TDbContext, TEntity, TPrimaryKey> : QueryableRepositoryBase<TEntity, TPrimaryKey>
where TDbContext : AbpDbContext<TDbContext> where TDbContext : AbpDbContext<TDbContext>
where TEntity : class, IEntity<TPrimaryKey> where TEntity : class, IEntity<TPrimaryKey>
{ {
@ -23,19 +25,19 @@ namespace Volo.Abp.Repositories.EntityFrameworkCore
DbContext = dbContext; DbContext = dbContext;
} }
public override List<TEntity> GetAllList() public override IQueryable<TEntity> GetQueryable()
{ {
return GetQueryable().ToList(); return DbSet;
} }
public override Task<List<TEntity>> GetAllListAsync() public override Task<List<TEntity>> GetListAsync()
{ {
return GetQueryable().ToListAsync(); return GetQueryable().ToListAsync();
} }
public override TEntity Get(TPrimaryKey id) public override async Task<TEntity> GetAsync(TPrimaryKey id)
{ {
var entity = FirstOrDefault(id); var entity = await FirstOrDefaultAsync(id);
if (entity == null) if (entity == null)
{ {
throw new EntityNotFoundException(typeof(TEntity), id); throw new EntityNotFoundException(typeof(TEntity), id);
@ -49,40 +51,53 @@ namespace Volo.Abp.Repositories.EntityFrameworkCore
return DbSet.Find(id); return DbSet.Find(id);
} }
public override Task<TEntity> FirstOrDefaultAsync(TPrimaryKey id)
{
return DbSet.FindAsync(id);
}
public override Task<TEntity> FirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate)
{
return GetQueryable().FirstOrDefaultAsync(predicate);
}
public override TEntity Insert(TEntity entity) public override TEntity Insert(TEntity entity)
{ {
return DbSet.Add(entity).Entity; return DbSet.Add(entity).Entity;
} }
public override TEntity Update(TEntity entity) public override TPrimaryKey InsertAndGetId(TEntity entity)
{ {
return DbSet.Update(entity).Entity; var insertedEntity = Insert(entity);
DbContext.SaveChanges();
return insertedEntity.Id;
} }
public override void Delete(TEntity entity) public override async Task<TPrimaryKey> InsertAndGetIdAsync(TEntity entity)
{ {
DbSet.Remove(entity); var insertedEntity = await InsertAsync(entity);
await DbContext.SaveChangesAsync();
return insertedEntity.Id;
} }
public override void Delete(TPrimaryKey id) public override TEntity Update(TEntity entity)
{ {
var entity = FirstOrDefault(id); return DbSet.Update(entity).Entity;
if (entity == null) }
{
return;
}
Delete(entity); public override void Delete(TEntity entity)
{
DbSet.Remove(entity);
} }
public override int Count() public override Task<int> CountAsync()
{ {
return GetQueryable().Count(); return DbSet.CountAsync();
} }
protected virtual IQueryable<TEntity> GetQueryable() public override Task<int> CountAsync(Expression<Func<TEntity, bool>> predicate)
{ {
return DbSet; return DbSet.CountAsync(predicate);
} }
} }
} }

6
src/Volo.Abp/Volo/Abp/Domain/Repositories/IQueryableRepository.cs

@ -14,21 +14,21 @@ namespace Volo.Abp.Domain.Repositories
/// Used to get a IQueryable that is used to retrieve entities from entire table. /// Used to get a IQueryable that is used to retrieve entities from entire table.
/// </summary> /// </summary>
/// <returns>IQueryable to be used to select entities from database</returns> /// <returns>IQueryable to be used to select entities from database</returns>
IQueryable<TEntity> GetAll(); IQueryable<TEntity> GetQueryable();
/// <summary> /// <summary>
/// Used to get all entities based on given <paramref name="predicate"/>. /// Used to get all entities based on given <paramref name="predicate"/>.
/// </summary> /// </summary>
/// <param name="predicate">A condition to filter entities</param> /// <param name="predicate">A condition to filter entities</param>
/// <returns>List of all entities</returns> /// <returns>List of all entities</returns>
List<TEntity> GetAllList(Expression<Func<TEntity, bool>> predicate); List<TEntity> GetList(Expression<Func<TEntity, bool>> predicate);
/// <summary> /// <summary>
/// Used to get all entities based on given <paramref name="predicate"/>. /// Used to get all entities based on given <paramref name="predicate"/>.
/// </summary> /// </summary>
/// <param name="predicate">A condition to filter entities</param> /// <param name="predicate">A condition to filter entities</param>
/// <returns>List of all entities</returns> /// <returns>List of all entities</returns>
Task<List<TEntity>> GetAllListAsync(Expression<Func<TEntity, bool>> predicate); Task<List<TEntity>> GetListAsync(Expression<Func<TEntity, bool>> predicate);
/// <summary> /// <summary>
/// Gets an entity with given given predicate or null if not found. /// Gets an entity with given given predicate or null if not found.

4
src/Volo.Abp/Volo/Abp/Domain/Repositories/IRepository.cs

@ -14,13 +14,13 @@ namespace Volo.Abp.Domain.Repositories
/// Used to get all entities. /// Used to get all entities.
/// </summary> /// </summary>
/// <returns>List of all entities</returns> /// <returns>List of all entities</returns>
List<TEntity> GetAllList(); List<TEntity> GetList();
/// <summary> /// <summary>
/// Used to get all entities. /// Used to get all entities.
/// </summary> /// </summary>
/// <returns>List of all entities</returns> /// <returns>List of all entities</returns>
Task<List<TEntity>> GetAllListAsync(); Task<List<TEntity>> GetListAsync();
/// <summary> /// <summary>
/// Gets an entity with given primary key. /// Gets an entity with given primary key.

44
src/Volo.Abp/Volo/Abp/Domain/Repositories/QueryableRepositoryBase.cs

@ -10,23 +10,45 @@ namespace Volo.Abp.Domain.Repositories
public abstract class QueryableRepositoryBase<TEntity, TPrimaryKey> : RepositoryBase<TEntity, TPrimaryKey>, IQueryableRepository<TEntity, TPrimaryKey> public abstract class QueryableRepositoryBase<TEntity, TPrimaryKey> : RepositoryBase<TEntity, TPrimaryKey>, IQueryableRepository<TEntity, TPrimaryKey>
where TEntity : class, IEntity<TPrimaryKey> where TEntity : class, IEntity<TPrimaryKey>
{ {
public abstract IQueryable<TEntity> GetAll(); public abstract IQueryable<TEntity> GetQueryable();
public abstract List<TEntity> GetAllList(Expression<Func<TEntity, bool>> predicate); public override List<TEntity> GetList()
{
return GetQueryable().ToList();
}
public virtual Task<List<TEntity>> GetAllListAsync(Expression<Func<TEntity, bool>> predicate) public virtual List<TEntity> GetList(Expression<Func<TEntity, bool>> predicate)
{ {
return Task.FromResult(GetAllList(predicate)); return GetQueryable().Where(predicate).ToList();
} }
public abstract TEntity FirstOrDefault(Expression<Func<TEntity, bool>> predicate); public virtual Task<List<TEntity>> GetListAsync(Expression<Func<TEntity, bool>> predicate)
{
return Task.FromResult(GetList(predicate));
}
public override TEntity FirstOrDefault(TPrimaryKey id)
{
return FirstOrDefault(CreateEqualityExpressionForId(id));
}
public virtual TEntity FirstOrDefault(Expression<Func<TEntity, bool>> predicate)
{
return GetQueryable().FirstOrDefault(predicate);
}
public virtual Task<TEntity> FirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate) public virtual Task<TEntity> FirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate)
{ {
return Task.FromResult(FirstOrDefault(predicate)); return Task.FromResult(FirstOrDefault(predicate));
} }
public abstract void Delete(Expression<Func<TEntity, bool>> predicate); public virtual void Delete(Expression<Func<TEntity, bool>> predicate)
{
foreach (var entity in GetQueryable().Where(predicate).ToList())
{
Delete(entity);
}
}
public virtual Task DeleteAsync(Expression<Func<TEntity, bool>> predicate) public virtual Task DeleteAsync(Expression<Func<TEntity, bool>> predicate)
{ {
@ -34,7 +56,15 @@ namespace Volo.Abp.Domain.Repositories
return Task.CompletedTask; return Task.CompletedTask;
} }
public abstract int Count(Expression<Func<TEntity, bool>> predicate); public override int Count()
{
return GetQueryable().Count();
}
public virtual int Count(Expression<Func<TEntity, bool>> predicate)
{
return GetQueryable().Count(predicate);
}
public virtual Task<int> CountAsync(Expression<Func<TEntity, bool>> predicate) public virtual Task<int> CountAsync(Expression<Func<TEntity, bool>> predicate)
{ {

28
src/Volo.Abp/Volo/Abp/Domain/Repositories/RepositoryBase.cs

@ -9,14 +9,23 @@ namespace Volo.Abp.Domain.Repositories
public abstract class RepositoryBase<TEntity, TPrimaryKey> : IRepository<TEntity, TPrimaryKey> public abstract class RepositoryBase<TEntity, TPrimaryKey> : IRepository<TEntity, TPrimaryKey>
where TEntity : class, IEntity<TPrimaryKey> where TEntity : class, IEntity<TPrimaryKey>
{ {
public abstract List<TEntity> GetAllList(); public abstract List<TEntity> GetList();
public virtual Task<List<TEntity>> GetAllListAsync() public virtual Task<List<TEntity>> GetListAsync()
{ {
return Task.FromResult(GetAllList()); return Task.FromResult(GetList());
} }
public abstract TEntity Get(TPrimaryKey id); public virtual TEntity Get(TPrimaryKey id)
{
var entity = FirstOrDefault(id);
if (entity == null)
{
throw new EntityNotFoundException(typeof(TEntity), id);
}
return entity;
}
public virtual Task<TEntity> GetAsync(TPrimaryKey id) public virtual Task<TEntity> GetAsync(TPrimaryKey id)
{ {
@ -62,7 +71,16 @@ namespace Volo.Abp.Domain.Repositories
return Task.CompletedTask; return Task.CompletedTask;
} }
public abstract void Delete(TPrimaryKey id); public virtual void Delete(TPrimaryKey id)
{
var entity = FirstOrDefault(id);
if (entity == null)
{
return;
}
Delete(entity);
}
public virtual Task DeleteAsync(TPrimaryKey id) public virtual Task DeleteAsync(TPrimaryKey id)
{ {

3
src/Volo.Abp/project.json

@ -8,7 +8,8 @@
"Volo.ExtensionMethods": "1.0.0-*", "Volo.ExtensionMethods": "1.0.0-*",
"Newtonsoft.Json": "9.0.1", "Newtonsoft.Json": "9.0.1",
"Nito.AsyncEx.Context": "1.1.0", "Nito.AsyncEx.Context": "1.1.0",
"System.Runtime.Loader": "4.3.0" "System.Runtime.Loader": "4.3.0",
"System.Linq.Queryable": "4.3.0"
}, },
"frameworks": { "frameworks": {

Loading…
Cancel
Save