2012-09-07 46 views
2

我有以下控制器(在圖中)調用靜態方法來獲取數據。由於我要在很多其他頁面上使用這些數據,我不想一次又一次地請求數據。這就是爲什麼我要檢查數據是否爲空,然後適當地返回值。當我想在我的類/方法中使用不同類型時,是否存在ant設計解決方案

private static IEnumerable<MovieDetails> GetJsonData(string jsonRequestURL) 
{ 
    try 
    { 
     using (var wc = new WebClient()) 
     { 
      var json = wc.DownloadString(jsonRequestURL); 
      var rootObj = JsonConvert.DeserializeObject<MoviesListRootObject>(json); 

      var responseObject = rootObj.movieResponse; 

      var movieDetails = responseObject.Select(movieDetail => 
                 new MovieDetails 
                 { 
                  Description = movieDetail.description, 
                  MovieURI = movieDetail.formats.res150p, 
                  Thumbnail = movieDetail.image, 
                  Title = movieDetail.title, 
                  ID = movieDetail.id 
                 }); 
      return movieDetails; 
     } 
    } 

    catch (Exception exception) 
    { 
     //Error Handling 
    } 
} 

這是完美的,直到時間,GetJsonData是Desrializng只有一個類型(目前MoviesListRootObject如果我想Root對象恩的ConvertTo AnotherType什麼:FeaturedlistRootObject)。

但如何在同樣的方法我可以desirialing其他類型? Diagram of controllers

是泛型唯一選擇還是存在一些更好的設計/功能我可以使用(不知道動態將有多大幫助)?

同樣,如果我只剩下泛型,我可以避免編寫基於不同類型的代碼嗎?

+2

你爲什麼試圖避免使用泛型? – svick

+7

只是說 - 我希望你不要去那個異常處理的生產! – Oded

+0

@svick,因爲我必須檢查所有類型並通過執行來編寫它,如果...,如果.....我不能在這裏使用OOP以更好的方式解決問題嗎? – Simsons

回答

2

似乎有是你的代碼的兩個部分,可以改變:

  1. 根對象的類型(例如MoviesListRootObject)和結果的類型(例如IEnumerable<MovieDetails>
  2. 是怎樣的結果從根對象創建

泛型是#1的完美解決方案,但它們對#2無助,你需要其他一些機制。根據代碼的結構,#2的最佳解決方案可能會有所不同。我覺得你非常有兩個選擇:

  1. 使該方法一般和使用委託創建結果
  2. 使整個型通用,並通過調用一個抽象方法
創建結果

選擇1可能是這個樣子:

private static TResult GetJsonData<TRoot, TResult>(
    string jsonRequestURL, Func<TRoot, TResult> resultSelector) 
{ 
    using (var wc = new WebClient()) 
    { 
     var json = wc.DownloadString(jsonRequestURL); 
     var rootObj = JsonConvert.DeserializeObject<TRoot>(json); 
     return resultSelector(rootObj); 
    } 
} 

private static IEnumerable<MovieDetails> GetMovieDetails(string jsonRequestURL) 
{ 
    return GetJsonData<MoviesListRootObject, IEnumerable<MovieDetails>>(
     jsonRequestURL, 
     rootObj => 
     { 
      var responseObject = rootObj.movieResponse; 

      var movieDetails = responseObject.Select(
       movieDetail => 
        new MovieDetails 
        { 
         Description = movieDetail.description, 
         MovieURI = movieDetail.formats.res150p, 
         Thumbnail = movieDetail.image, 
         Title = movieDetail.title, 
         ID = movieDetail.id 
        }); 
      return movieDetails; 
     }); 
} 

這種方式,下載JSON數據的通用代碼從特定的代碼分開下載MOV即細節。

相關問題