У меня есть понимание, что использование процедур доступа к данным непосредственно из кода представления считается злым. Поэтому у меня есть отдельный проект Repositories
, а также проект Services
. Из того, что я могу сказать, типичное использование уровня сервиса заключается в том, чтобы изолировать доступ к данным из презентации. Все хорошо и хорошо.Должен ли класс службы быть более чем оболочкой класса репозитория?
У меня довольно простой домен, просто класс Movie
. Интерфейс соответствующий репозиторий:
public interface IMovieRepository
{
void AddMovie(Movie movie);
void UpdateMovie(Movie movie);
void RemoveMovie(Movie movie);
int GetMovieCount();
Movie GetMovieById(int id);
IEnumerable<Movie> GetAllMovies();
IEnumerable<Movie> GetMoviesByGenre(Genre genre);
IEnumerable<Movie> GetMoviesByYear(int year);
IEnumerable<Movie> GetMoviesByActor(string actor);
IEnumerable<Movie> GetMoviesByTitle(string title);
}
Теперь, когда я к классу обслуживания, чтобы использовать репозиторий, я заводиться определение интерфейса, как это:
public interface IMovieService
{
Movie CreateMovie(string title, int year, Genre genre, int length, IEnumerable<string> actors);
void UpdateMovie(Movie movie);
void RemoveMovie(Movie movie);
int GetMovieCount();
Movie GetMovieById(int id);
IEnumerable<Movie> GetAllMovies();
IEnumerable<Movie> GetMoviesByGenre(Genre genre);
IEnumerable<Movie> GetMoviesByYear(int year);
IEnumerable<Movie> GetMoviesByActor(string actor);
IEnumerable<Movie> GetMoviesByTitle(string title);
}
Два интерфейса очень похожи, что кажется мне странным. Я ожидаю, что реализация IMovieService
будет использовать внутреннюю реализацию IMovieRepository
, по существу являющуюся тонкой оболочкой на последнем. Вероятно, может быть какая-то проверка или кэширование или тому подобное, но первое похоже, что в большинстве случаев оно просто переходит к последнему.
Я иду по этому правильному пути, или есть что-то, что мне не хватает?
Я знаю, что это кажется чересчур избыточным для такого простого домена, но я пытаюсь прибить структуру слоев и абстракции для использования в будущих и более крупных проектах.
EDIT: чтобы быть немного яснее, я не говорю о NHibernate или шаблоне хранилища, а о расслоении проблем.
ОБНОВЛЕНИЕ: спасибо людям. Я полагаю, что буду поддерживать конкретные методы запросов в классе службы, чтобы быть понятным для уровня пользовательского интерфейса, и попытаться обобщить репозиторий на некоторые, передав запросы функции запроса.