2011-12-27 8 views
0

"今日"、 "明日"、 "早い"、 "すべてのイベント"などのタブがあります。
各タブには、条件(評価、名前、イベントの日付)、期間(今日、曜日、明日、2週間)と注文(昇順または降順)があります。
そして、タブに応じてデータを受け取りたいと思います。その上FilmSportと:特定の条件ですべてのリポジトリからデータを取得するオプション

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は、クラスによって実装されたインタフェース: 以下の方法があります。
各オブジェクトのリポジトリ:FilmRepositorySportRepositoryなどもあります。

特定の条件、期間、順序ですべてのリポジトリからデータを取得するにはどうすればよいですか?書くことに消極的
は次のとおりです。

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 
} 
関連する問題