0

現在、いくつかのWebサービス呼び出しを行う必要があるWindows8Storeアプリを構築しています。呼び出しは、オブジェクトに逆シリアル化するjson文字列を返します。WinRT用のCaliburn.MicroでMVVMデザインパターンを使用しています。

最初に、各ビューモデルへのWebサービス呼び出しからデータを取得するために、それ自体の静的インスタンスを宣言するクラスDataStoreを作成しました。そのクラスには、私のすべてのモデルに対応するプロパティがありました。Webサービスの呼び出しを行う必要がある場合、パラメーターの辞書を読み取る「APIData」の静的クラスメソッドを呼び出し、それらのパラメーターをJSONにシリアル化し、API呼び出しを行い、JSONの結果をDataStoreクラスに返しました。その時点で、JSONは逆シリアル化され、データストアのプロパティを更新するために使用されました。各ViewModelで、そのVMのデータコンテキストに必要なDataStoreプロパティを参照しました。

その結果、コードが繰り返され、データストアクラスが非常に乱雑になりました。

私の質問は、Webサービス呼び出しから返されたjsonを使用してモデルにデータを入力する必要がある場合に使用するのに適したデザインパターンは何でしょうか?

4

1 に答える 1

1

あなたの最初の試みは「単一責任の原則」を破ったようであり、それが非常に厄介なデータストアクラスにつながったようです。

ビューモデルデータ操作の私の実装は、「ViewModelPopulator」クラスのコレクションを保持することです。各サービスに入力されたviewmodelは、viewmodelsプロパティをハイドレイトする責任があるviewmodelpopulatorへの参照を保持します。

コードの再利用を促進するために、単一のビューモデルに異なるポピュレーターが入力される可能性があります(たとえば、' 'は' 'または''のCarCollectionViewModelいずれかによって入力されます)。したがって、参照は実際には、Tが入力するビューモデルである場所を参照します。 。HondaCollectionViewModelPopulatorKiaCollectionViewModelPopulatorIViewModelPopulator<T>

これにより、ビューモデルとデータアクセス層の間の結合が緩くなります。あなたの例では、Jsonの逆シリアル化を(おそらくいくつかのヘルパーメソッドを介して)viewmodelpopulatorクラスに配置します。

さらに、これにより、設計時にUIレイヤーからビューモデルにポピュレーターを宣言的に挿入したり(以下の例のように)、実行時にコードビハインドでポピュレーターを割り当てたりすることができます。

<Page.DataContext>
    <VM:SearchPageViewModel>
        <VM:SearchPageViewModel.ViewModelPopulator>
            <VMP:SearchPageViewModelPopulator />
        </VM:SearchPageViewModel.ViewModelPopulator>
    </VM:SearchPageViewModel>
</Page.DataContext>
于 2013-03-21T12:32:16.660 に答える