2

データを取得するために静的メソッドを呼び出す次のコントローラー (図) があります。他の多くのページでデータを使用するので、何度もデータを要求したくありません。そのため、データが null かどうかを確認し、適切に値を返しています。

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
    }
}

これは、1つのタイプのみにデシリアライズするまでは完璧GetJsonDataです(現在MoviesListRootObject、ルートオブジェクトの別のタイプに変換したい場合は ex: FeaturedlistRootObject)。

しかし、同じ方法でどのように他のタイプにデシリアリングできますか? コントローラーの図

ジェネリックが唯一の選択肢ですか、それとも私が使用できるより良い設計/機能がいくつかありますか (ダイナミックがどれほど役立つかわかりません)?

繰り返しますが、ジェネリックしか残っていない場合、さまざまな型に基づいてコードを書くことを避けることができますか?

4

1 に答える 1

2

変更できるコードの 2 つの部分があるようです。

  1. ルート オブジェクトの型 (例: MoviesListRootObject) と結果の型 (例: IEnumerable<MovieDetails>)
  2. ルート オブジェクトからどのように結果が作成されるか

ジェネリックは #1 の完璧なソリューションですが、#2 ではあまり役に立ちません。そのためには他のメカニズムが必要です。コードの構造によっては、#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 データをダウンロードするための一般的なコードは、映画の詳細をダウンロードするための特定のコードから分離されます。

于 2012-09-07T12:33:14.967 に答える