EF Использование общих и специальных репозиториев - PullRequest
0 голосов
/ 27 марта 2012

У меня есть следующий общий репозиторий:

public class GenericRepository<TEntity> where TEntity : class {
    private EFDbContext context;
    private DbSet<TEntity> dbSet;

    public GenericRepository(EFDbContext context) {}

    public IEnumerable<TEntity> GetAll() {}

    public IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, string includeProperties = "") {}

    public TEntity GetByID(int id) {}

    public void Insert(TEntity entity) {}

    public void Delete(int id) {}

    public void Delete(TEntity entity) {}

    public void Update(TEntity entity) {}
}    

Теперь я понимаю, как я могу использовать это для своих сущностей, но я не понимаю, что делать, если сущность нуждается не только в этих методах? Скажем, у меня есть сущность под названием «Турнир», и я хочу получить все группы в этом турнире, куда пойдет метод «GetTournamentGroups»?

Должен ли я вместо использования универсального репозитория написать базовый интерфейс репозитория, от которого наследуются все собственные интерфейсы сущностей, а затем просто добавить дополнительные методы, необходимые для каждой сущности?

Ответы [ 2 ]

2 голосов
/ 27 марта 2012

Вы также можете просто использовать

var TournamentGroups = new List<Group>();
using( var GenericRepo = new GenericRepository<Group>())
{
 TournamentGroups = GenericRepo.Get(group => group.TournamentId == tournamentId);
}

где-то с вашим обычным хранилищем. Кажется, немного излишне делать класс, который делает это.

1 голос
/ 27 марта 2012

Метод GetTournamentGroups (), по-видимому, принадлежит слою над слоем репозитория:

class TournamentModel
{
    private int tournamentId;  // initialized in constructor
    private GenericRepository<Group> repository;  // initialized in constructor

    IEnumerable<Group> GetTournamentGroups()
    {
        return repository.Get( group => group.TournamentId == tournamentId);
    }
}

Я бы порекомендовал использовать IQueryable вместо IEnumerable в вашем GenericRepository. Было бы более гибким, если вам нужно применить фильтры или сортировать выражения до того, как вы сделаете фактический запрос к базе данных.

...