Получить данные из всех репозиториев по определенным критериям - PullRequest
0 голосов
/ 27 декабря 2011

У меня есть вкладка «Сегодня», «Завтра», «Скоро», «Все события» (и не только).
У каждой вкладки есть критерий (рейтинг, имя, дата события), период (сегодня,день, неделя, завтра, две недели) и порядок (по возрастанию или по убыванию).
И я хочу получать данные в зависимости от вкладки.Существует следующий метод:

private List<IEvent> GetEventList(int tab)
{
    var posterEvent = PosterEventRepository.GetById(tab);

    var criteria =  Enum.Parse(typeof (PosterEventEnum.CriteriaEvent), posterEvent.Criteria);
    var period = Enum.Parse(typeof(PosterEventEnum.CriteriaEvent), posterEvent.Period);
    var order = Enum.Parse(typeof(PosterEventEnum.CriteriaEvent), posterEvent.Order);
}

IEvent интерфейс, который реализуется классами: Film, Sport и т. Д.
Существует также хранилище для каждого объекта: FilmRepository, SportRepository и так далее.

Как лучше всего получить данные из всех репозиториев по определенным критериям, периоду, порядку?
Неохотно писать следующим образом:

switch(criteria)
{
    case "Today":
    resultFilm = FilmRepository.FilmRepository.GetFilmsForToday();
    resultSport = SportRepository.GetSportsForToday();
    ...
   //then combine and sorting by rating
}

Спасибо.

Ответы [ 2 ]

1 голос
/ 27 декабря 2011

Вместо использования переключателя вы можете иметь реестр для регистрации каждого критерия и соответствующих методов хранилища.Реестр может содержать словарь пары ключ-значение, в качестве значения которого указан ключ опции, а в качестве значения - список делегированных методов.Примерно так:

Dictionary<string,Dictionary<string,Func<IEvent>> _registry;

_registry.Add("Today",new Dictionary<string,Func<IEvent>>{{"Film",FilmRepository.GetFilmsForToday},{"Sport",SportRepository.GetSportsForToday}};

теперь вы можете легко зарегистрировать любое количество критериев, которые могут быть добавлены к вашим вкладкам, и нет необходимости изменять любую другую часть вашего кода

Тогда вы можетезамените оператор switch следующим:

var methods=_registry[criteria];
resultFilm=methods["Film"]();
resultSport=methods["Sport"]();
0 голосов
/ 27 декабря 2011

Вы можете посмотреть шаблон спецификации , но реализация будет варьироваться в зависимости от внутренней структуры ваших репозиториев.

В общем, вам нужно будет перебрать все репозитории и получить все элементы, которые удовлетворяютсостояние

switch(criteria) 
{ 
    case "Today": 
        var todaySpec=new TodaySpec();
        var result=repos.SelectMany(r=>r.GetRelevant(todaySpec)); 

   //then combine and sorting by rating 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...