2012-03-26 11 views
0

Ich habe folgende generische Repository:EF Mit allgemeiner und spezieller Repositories

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) {} 
}  

Jetzt verstehe ich, wie ich dies für meine Einheiten verwenden kann, aber ich verstehe nicht, was passiert, wenn ein Unternehmen mehr tun muss, als nur diese Methoden? Sagen wir, ich hätte eine Entität namens "Tournament" und ich möchte alle Gruppen in diesem Turnier bekommen, wo würde die "GetTournamentGroups" -Methode laufen?

Soll ich anstelle eines generischen Repositorys eine Basisrepository-Schnittstelle schreiben, von der alle eigenen Schnittstellen der Entitäten erben, und dann einfach die zusätzlichen Methoden hinzufügen, die für jede Entität benötigt werden?

Antwort

1

Methode GetTournamentGroups() scheint über Repository-Schicht zur Schicht gehören:

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); 
    } 
} 

Ich empfehle allerdings mit würde IQueryable insteam von IEnumerable in Ihrem GenericRepository. Es wäre flexibler, wenn Sie Filter anwenden oder Ausdrücke sortieren müssen vor Sie eine tatsächliche Datenbankabfrage machen.

+0

Ok, das macht Sinn, ich dachte nur, mit dem Repository-Muster sollten Sie Ihre Entitäten frei von Methoden halten und nur die Eigenschaften darin haben. Habe ich das falsch verstanden? – Mekswoll

+0

Wenn Sie Entitäten nur als Datenübertragungsobjekte betrachten, ist Ihr Verständnis korrekt. In meinem Beispiel ist TournamentModel keine Entität, sondern Teil der Business-Schicht (Entitätsklassen sind Turnier und Gruppe). –

2

Sie könnten auch einfach

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

irgendwo mit Ihrem normalen Repository verwenden. Es scheint ein wenig übertrieben zu sein, eine Klasse zu machen, die das tut.