2009-12-05 4 views
31

Ich habe zwei verschiedene Ansätze zum Erstellen von generischen Repositories gesehen. Was sind die Unterschiede zwischen diesen beiden Ansätzen (Vor- und Nachteile)? Bitte diregard Unterschied in den Methoden, weil ich in Unterschied interessiert bin zwischenGenerisches Repository - IRepository <T> oder IRepository

public interface IRepository<T> where T : class 

und

public interface IRepository : IDisposable 

Gibt es einen Unterschied in der Funktionalität, Flexibilität, Unit-Tests ...? Was werde ich bekommen oder verlieren?
Gibt es einen Unterschied, wie sie in Dependency Injection-Frameworks registriert sind?

Option 1

public interface IRepository<T> where T : class 
{ 
     T Get(object id); 
     void Attach(T entity); 
     IQueryable<T> GetAll(); 
     void Insert(T entity); 
     void Delete(T entity); 
     void SubmitChanges(); 
} 

Option 2

public interface IRepository : IDisposable 
    { 
     IQueryable<T> GetAll<T>(); 
     void Delete<T>(T entity); 
     void Add<T>(T entity); 
     void SaveChanges(); 
     bool IsDisposed(); 
    } 

Antwort

27

Der größte Unterschied ist, dass IRepository<T> auf einen einzigen Typ gebunden ist, während ein IRepository potentiell auf mehrere Arten gebunden ist. Welche davon angemessen ist, hängt stark von Ihrem speziellen Szenario ab.

Generell finde ich IRepository<T> nützlicher zu sein. Zum Zeitpunkt der Verwendung ist es sehr klar, was der Inhalt von IRepository<T> sind (T). Auf der anderen Seite ist es nicht klar von einem gegebenen IRepository was darin enthalten ist.

In Fällen, in denen ich mehrere Arten von Objekten speichern muss, erstelle ich normalerweise eine Karte von IRepository<T> Instanzen. Zum Beispiel: Dictionary<T,IRepository<T>>.

+5

Wenn meine Entitäten sehr unterschiedliche Methoden haben, empfehle ich nicht, IRepository für jede Entität zu implementieren, da jede Entität dann eine leere Implementierung einer Methode hat, die sie möglicherweise gar nicht verwendet. Do IRepository Nur wenn Ihre Entitäten viele gemeinsame Methoden haben, werden Ihre Repository-Klassen am Ende leere Methoden enthalten. – msfanboy

+2

Ich glaube nicht, dass eine leere Methode so gefährlich ist wie ein riesiges, weltumspannendes Sonnenflair. – ProfK

Verwandte Themen