2012-03-26 5 views
0

У меня есть следующий общий репозиторий:EF Использование общих и конкретных репозиториев

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»?

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

ответ

1

Метод GetTournamentGroups(), кажется, принадлежит к слою выше Repository слоя:

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 insteam из IEnumerable в вашем GenericRepository, хотя. Было бы более гибким, если вам нужно применять фильтры или сортировать выражения до, вы делаете фактический запрос к базе данных.

+0

Хорошо, это имеет смысл, я просто подумал с шаблоном хранилища, который должен был содержать ваши сущности без методов и просто иметь свойства там. Не понял ли я это? – Mekswoll

+0

Если вы считаете объекты только объектами передачи данных, вы понимаете правильность. В моем примере TournamentModel не является сущностью, он является частью бизнес-уровня (классы сущностей - это турниры и группы). –

2

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

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

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

Смежные вопросы