2011-12-27 71 views
0

我有一个选项卡“今日”,“明天”,“很快”,“所有事件”(以及更多)。
每个标签都有一个标准(评级,名称,事件日期),时间段(今天,星期,明天,两周)和订单(升序或降序)。
我想根据标签接收数据。 有下面的方法:通过特定条件选项从所有存储库获取数据

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接口是由类实现:FilmSport等。
每个对象还有一个存储库:FilmRepository,SportRepository等等。

如何最好地从特定标准,期间,订单中获取所有存储库中的数据?
不愿写如下:

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

感谢。

回答

1

而不是使用一个开关的所有项目,你可以有一个注册表注册的每个选项的标准和相应的库方法。 注册表可以包含一个键值对字典,其中包含选项名称作为其键和委托方法列表作为其值。 事情是这样的:

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

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

现在你可以很容易地注册任意数量的可以添加到您的标签标准,而且也没有必要改变你的代码的任何其他部分

然后你就可以更换开关声明:

var methods=_registry[criteria]; 
resultFilm=methods["Film"](); 
resultSport=methods["Sport"](); 
0

您可以查看specification模式,但实现将根据您的回购内部结构而有所不同。

一般来说,你需要通过所有存储库进行迭代,并获得满足条件

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

    //then combine and sorting by rating 
} 
相关问题