C# Класс шаблона для объектов с разными именами переменных - PullRequest
0 голосов
/ 13 июля 2020

Я работаю над приложением, которое использует дизайн базы данных Code first с EF Core. У меня, конечно, есть коллекция моделей и контекст базы данных. Я пытаюсь создать общую c службу данных для обработки базовых c операций CRUD. Вот пример функций создания и удаления для модели компании.

public async Task<Company> Create(Company company)
{
    using (ApplicationDbContext context = _contextFactory.CreateDbContext())
    {
        EntityEntry<Company> newEntity = await context.Set<Company>().AddAsync(company);
        await context.SaveChangesAsync();
        return newEntity.Entity;
    }
}

public async Task<bool> Delete(int id)
{
    using (ApplicationDbContext context = _contextFactory.CreateDbContext())
    {
        Company entity = await context.Set<Company>().FirstOrDefaultAsync((e) => e.CompanySysID == id);
        context.Set<Company>().Remove(entity);
        await context.SaveChangesAsync();
            
        return true;
    }
}

Я хочу создать шаблонную версию этой службы для всех моих моделей. Очевидно, для функции create это не будет проблемой. Однако для функции удаления (среди прочего) каждая модель имеет другое имя для своего идентификатора (первичный ключ) в соответствии со строками [Model Name] SysID, чтобы следовать внутренним соглашениям. Кажется очень против DRY иметь отдельный сервис для каждой модели, когда почти все они идентичны. Есть ли способ превратить этот класс в шаблон?

1 Ответ

0 голосов
/ 13 июля 2020

То, что вы ищете, это общий c класс репозитория или лучше назвать его generi c класс доступа к данным, у меня уже есть суть для такого рода действий и я могу управлять всем, что вам нужно, вы можете удалить дополнительные действия, если они вам не нужны.

public interface IEntityRepository<TEntity, TKey>
    where TEntity : class, Entity.IEntity<TKey>
    where TKey : IComparable
{

    #region Utility
    long Count();
    Task<long> CountAsync();
    Task<bool> AnyAsync();
    Task<bool> AnyAsync(Expression<Func<TEntity, bool>> predicate,
        Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null);
    bool AnyLocal(Func<TEntity, bool> predicate);
    #endregion

    #region Delete
    Task<(bool success, TEntity obj)> DeleteAsync(TKey Id);
    Task<(bool success, IEnumerable<TEntity> objs)> DeleteListAsync(IEnumerable<TKey> Ids);
    Task<(bool success, IEnumerable<TEntity> objs)> DeleteListAsync(IEnumerable<Guid> guids);
    Task<(bool success, IEnumerable<TEntity> objs)> PhysicalDeleteListAsync(IEnumerable<TKey> Ids);
    Task<(bool success, IEnumerable<TEntity> objs)> PhysicalDeleteListAsync(IEnumerable<Guid> guids);
    Task BatchDeleteAsync(IEnumerable<Guid> guids);
    #endregion

    #region Update
    Task<(bool success, TEntity obj)> UpdateAsync(TEntity input);
    Task<(bool success, IEnumerable<TEntity> objs)> UpdateListAsync(IEnumerable<TEntity> input);
    Task BatchUpdateAsync(IEnumerable<TEntity> input);
    #endregion

    #region Create
    Task<(bool success, TEntity obj)> CreateAsync(TEntity input);
    Task<(bool success, IEnumerable<TEntity> objs)> CreateListAsync(IEnumerable<TEntity> input);
    Task BatchInsertAsync(IEnumerable<TEntity> input);
    #endregion

    #region Get
    Task<TEntity> GetByIdAsync(TKey Id, Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null);
    Task<TEntity> GetByGuidAsync(Guid Id, Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null);
    Task<IEnumerable<TEntity>> GetAllAsync(Expression<Func<TEntity, bool>> predicate = null,
        Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null);
    Task<TEntity> FirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate,
        Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null);
    Task<IEnumerable<TEntity>> GetListByIdsAsync(IEnumerable<TKey> ids,
        Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null);
    Task<IEnumerable<TEntity>> GetListByGuidsAsync(IEnumerable<Guid> guids,
        Func<IQueryable<TEntity>, IIncludableQueryable<TEntity, object>> include = null);
    #endregion
}

gist.github: https://gist.github.com/devlnull/cbcc3f927c36eb296e58f0d1be3e4ba2

...