@Mindgrow

Как создать абстрактный репозиторий?

Добрый день!

Есть несколько видов сущностей, такие как User, Role, Record, Person и прочее. Для каждой из этих сущностей я хочу сделать отдельные репозитории с одинаковыми наборами методами, но разными используемыми типами.
Сначала думал все реализовать просто с использованием обобщенного интерфейса, но подумал, а почему бы не сделать обобщенный абстрактный класс-репозиторий, в котором будут реализованы обобщенные методы.
Но столкнулся с такой проблемой - при работе с сущностями я использую ApplicationDbConext следующего формата:
class ApplicationDbContext: DbContext
{
public DbSetUsers {get;set;}
public DbSetRoles {get;set;}
....
}


как мне обобщить название поля контекста, чтобы для каждого типа сущностей использовалось свое имя поля
  • Вопрос задан
  • 232 просмотра
Пригласить эксперта
Ответы на вопрос 2
@OwDafuq
[Column("тут имя вашей колонки")]
Определяйте для каждого поля во всех классах наследниках базового
Ответ написан
Привет! Например, так.
public interface IEntity<TId> where TId : struct
{
    TId Id { get; set; }
}

public class Person: IEntity<int>
{
    public int Id { get; set; }
    //другие поля
}

public abstract class GenericRepository<TEntity, TKey>: where TKey : struct where TEntity :  IEntity<TKey>
{
    internal ApplicationDbConext context;
    public GenericRepository(ApplicationDbConext context)
    {
        this.context = context;
    }

    //сделаем глупый метод, чисто для примера	
    public async Task<TEntity> FirstOrDefaultAsync(TKey id)
    {
        return await сontext.Set<TEntity>().FirstOrDefaultAsync(x => x.Id.Equals(id));
    }
}

public class PersonRepository: GenericRepository<Person, int>
{
    //методы для PersonRepository
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы