Я ищу использовать шаблон IRepository (при поддержке NHibernate, если это имеет значение) в небольшом проекте. Домен является простым, преднамеренно, чтобы я мог сосредоточиться на понимании шаблона IRepository. Класс одиночного домена Movie
со свойствами для Year
, Genre
и Title
. Мое намерение состояло в том, чтобы "получить" фильмы, свойства которых соответствуют критериям вышеупомянутых типов.
Кажется, что конвенция имеет общий интерфейс IRepository
, аналогичный следующему:
public interface IRepository<T>
{
T Get(int id);
T[] GetAll();
void Add(T item);
void Update(T item);
void Delete(T item);
}
С базовой реализацией:
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) { ... }
}
Затем, чтобы иметь интерфейс, специфичный для домена:
public interface IMovieRepository
{
Movie[] GetByGenre(Genre genre);
Movie[] GetByYear(int year);
Movie[] GetByTitle(string title);
}
С реализацией, которая также расширяет базовый класс Repository
:
public class MovieRepository : Repository<Movie>, IMovieRepository
{
public Movie[] GetByGenre(Genre genre) { ... }
public Movie[] GetByYear(int year) { ... }
public Movie[] GetByTitle(string title) { ... }
}
Мне нужно будет добавить необходимую реализацию в базовый класс, а также конкретный, используя NHibernate, но я хотел бы знать, правильно ли я нахожусь на этом пути.
Похоже, что для одного класса домена существует довольно много накладных расходов, хотя было бы менее заметно, если бы было задействовано несколько классов доменов. Сейчас я стараюсь, чтобы это было просто, поэтому я могу определить концепцию.