У меня много сущностей и репозиториев. Мои сущности бывают двух типов: стираемые и несмываемые. Итак, у меня есть два базовых класса для сущностей.
Несмываемые сущности реализуют этот базовый класс:
public abstract class BaseEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public DateTime InsertedDate { get; set; }
public DateTime? UpdatedDate { get; set; }
//For recovering
public DateTime? DeletedDate { get; set; }
public bool Active { get; set; }
}
Стираемые сущности реализуют этот базовый класс:
public abstract class BaseErasableEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public DateTime InsertedDate { get; set; }
public DateTime? UpdatedDate { get; set; }
}
Репозитории, которые используют стираемый объект реализует этот базовый класс:
public class BaseErasableRepository<TEntity, TRepository> : DbContext, IBaseErasableRepository<TEntity> where TEntity : BaseErasableEntity where TRepository : DbContext
{
public BaseErasableRepository(DbContextOptions<TRepository> options) : base(options)
{ }
protected DbSet<TEntity> Entities { get; set; }
public IEnumerable<TEntity> GetAll()
{
return Entities ?? throw new CannotFindEntityException();
}
public TEntity GetById(int id)
{
var entity = Entities.Find(id) ?? throw new CannotFindEntityException(id);
return entity;
}
public void Update(TEntity entity)
{
Entities.Update(entity);
SaveChanges();
}
public void Delete(TEntity entity)
{
Entities.Remove(entity);
SaveChanges();
}
public IEnumerable<TEntity> GetFiltered(Func<TEntity, bool> condition = null)
{
return Entities.Where(condition) ?? throw new CannotFindEntityException();
}
}
Хранилища, использующие несмываемый объект, реализуют этот базовый класс:
public class BaseRepository<TEntity, TRepository> : DbContext, IBaseRepository<TEntity> where TEntity : BaseEntity where TRepository : DbContext
{
public BaseRepository(DbContextOptions<TRepository> options) : base(options)
{ }
protected DbSet<TEntity> Entities { get; set; }
public IEnumerable<TEntity> GetAll()
{
return Entities.Where(entity => entity.Active == true) ?? throw new CannotFindEntityException();
}
public TEntity GetById(int id)
{
var entity = Entities.Find(id) ?? throw new CannotFindEntityException(id);
if(!entity.Active)
throw new CannotFindEntityException();
return entity;
}
public void Update(TEntity entity)
{
Entities.Update(entity);
SaveChanges();
}
public void Delete(TEntity entity)
{
var toBeDeleteEntity = GetById(entity.Id);
toBeDeleteEntity.Active = false;
toBeDeleteEntity.DeletedDate = DateTime.Now;
Entities.Update(toBeDeleteEntity);
SaveChanges();
}
public IEnumerable<TEntity> GetFiltered(Func<TEntity, bool> condition = null)
{
return Entities.Where(entity => entity.Active).Where(condition) ?? throw new CannotFindEntityException();
}
}
Моя проблема: у меня есть больше методов для хранилищ. Они одинаковы для обоих хранилищ. Я должен написать тот же код два раза, когда я добавляю новую функцию. Есть ли лучший способ использовать один базовый класс хранилища?