Ich möchte das IRepository-Muster (unterstützt durch NHibernate, wenn es darauf ankommt) in einem kleinen Projekt verwenden. Die Domäne ist eine einfache, damit ich mich auf das IRepository-Muster konzentrieren kann. Die Klasse der einzelnen Domänen ist Movie
, mit Eigenschaften für Year
, Genre
und Title
. Meine Absicht wäre, Filme zu "bekommen", deren Eigenschaften den oben genannten Kriterien entsprechen.Benutzt ich IRepository richtig?
Convention scheint eine allgemeine IRepository
Schnittstelle, ähnlich wie die folgenden haben zu sein:
public interface IRepository<T>
{
T Get(int id);
T[] GetAll();
void Add(T item);
void Update(T item);
void Delete(T item);
}
Mit einer Basisimplementierung:
public abstract class Repository<T> : IRepository<T>
{
public T Get(int id) { ... }
public T[] GetAll() { ... }
public void Add(T item) { ... }
public void Update(T item) { ... }
public void Delete(T item) { ... }
}
Dann eine domänenspezifische Schnittstelle haben:
public interface IMovieRepository
{
Movie[] GetByGenre(Genre genre);
Movie[] GetByYear(int year);
Movie[] GetByTitle(string title);
}
Mit einer Implementierung, die auch die Basis 01 erweitertKlasse:
public class MovieRepository : Repository<Movie>, IMovieRepository
{
public Movie[] GetByGenre(Genre genre) { ... }
public Movie[] GetByYear(int year) { ... }
public Movie[] GetByTitle(string title) { ... }
}
ich brauchen würde, um die Durchführung zu der Basisklasse sowie den Beton ein, mit NHibernate hinzuzufügen, aber ich würde gerne wissen, ob ich auf dem richtigen Weg bin mit diesem Setup.
Es scheint nur ein wenig Overhead für nur eine Domänenklasse zu sein, obwohl es weniger auffällig wäre, wenn mehrere Domänenklassen beteiligt wären. Im Moment versuche ich, es einfach zu halten, damit ich das Konzept festhalten kann.
Ich mag Ihren Vorschlag für die Verwendung eines nicht-abstrakten 'Repository', um die übliche CRUD-artige Low-Level-Arbeit zu behandeln, die von den spezifischen Repos delegiert wurde. Es wirft das Problem auf, eine "ISession" sowohl in den generischen Repo als auch in den spezifischen Repo zu bekommen, der sie verwendet. –
Die ISession sollte über eine private ISessionFactory im Repository abgerufen werden. Das spezifische Repository verwendet dann eine WrapxxxInSession-Methode des generischen Repositorys. – Goblin
Ah ja, das hilft. Ich mag die Gesamtidee ... Ein weiterer Vorteil ist, dass das injizierte IRepository zum Testen verspottet werden kann. Es wird den Trick geben, Objekte in der richtigen Reihenfolge zu konstruieren und zu übergeben, aber wahrscheinlich kann ein IoC-Tool damit umgehen. –