2010-12-30 8 views
8

パブリックAPIからデータを取得するSilverlight Windows Phone 7アプリケーションがあります。 、UIでデータ駆動型Silverlight WP7アプリケーションのアーキテクチャ設計

  • コンテンツはすでに可能性があるコンテンツを、取得
  • ある場合の代わりにロードメッセージやロードプログレスバーを設定します。私は自分自身が何度も何度も同じことの多くをやって見つけます隔離されたファイルストレージにキャッシュされている、またはHTTP要求が必要な場合
  • コンテンツを取得できない場合(ネットワーク接続などなし)、エラーメッセージを表示します。
  • コンテンツが取得された場合は、UI
  • 次のクエリのためにメインメモリに内容を保存します

ユーザーに表示されるコンテンツは、ObservableCollectionなどのデータソースから直接取得することも、データソースのクエリを使用することもできます。

Iは、理想的にのみ次のニーズを指定するためのフレームワークには、この反復プロセスを考慮したいと思います:UIに

  • UI要素のコンテンツを表示する

    • がロード中に表示します、失敗した場合に、成功の
    • HTTPリクエストのURIメモリ
    • 番目の場所をに保持するデータ構造へのHTTPレスポンスを解析する方法
    • 分離ストレージ内の電子ファイルは、それが
    • が存在する場合、それはたくさんのように聞こえるが、二つの文字列、3つのFrameworkElementのかもしれメモリに

    を保持されるデータ構造にファイルの内容を解析する方法、および2つの方法は、私が現在持っているオーバーヘッドよりも小さいです。

    また、データはメモリ内に保持されており、これらのコレクションの直接収集と照会のために機能する必要があります。

    私の質問は以下のとおりです。

    は、このすでに実装されてのような何かを持っていますか?

    上記のトピックに関する私の考えは根本的に何らかの形で間違っていますか?二つの成分、ビューとモデルがあり

    :ここ

    は私が考えているデザインです。

    ビューには、ロード、失敗、および成功のためにFrameworkElementが与えられています。対応するモデルへの参照も与えられます。ビューはUserControlで、UIのどこかに配置されています。

    モデルのURIはデータのURI、データの解析方法、オプションでファイル名とファイルの解析方法を指定します。現在のステータス(読み込み/失敗/成功)が変わるたびに、データの取得とViewの通知を行います。ネットワークからダウンロードしたデータがキャッシュと異なる場合は、ネットワークデータが優先されます。アプリケーションが閉じるか、またはトゥーンブリンクされると、モデルはデータをキャッシュに書き込みます。

    どのように表示されますか?

  • 答えて

    4

    私はあなたの要件をよく読んでいる時間がありましたし、サウンドボードとして提供するいくつかの考えを述べました。

    まず、一般的な動作を繰り返すタスクでは、これは確実にアプローチする方法です。あなたはこの問題を考えているだけではありません。

    この種のことをやっている人は、同様の抽象化を作成しているかもしれませんが、私の知る限りでは公開されていません。

    あなたがそれをどの程度使い続けているかは、自分の用途だけでなく、非常によく似た要件を持つ人や、より一般的なケースを扱い、非常に広い観客。

    私は前者を前提にしていますが、それをさらに発展させることができるオープンソースプロジェクトとしてリリースする可能性を排除するものではありません。

    すべての可能性に対応しようとすることで、使用する実装の特質、特にUIデザインの選択について一定の前提ができます。

    私は全体的にあなたの思考が正しい方向にあると思います。あなたの高水準の思考の一部を読んでいるうちに、私はいくつかの事柄を簡素化でき(良いこと)、同時に強制力のあるUIを提供できると考えました。

    あなたの最初のポイントです。

    • あなたはそれがあなたにとって重要な場合は、これを行います
    • パフォーマンスisindeterminateのプログレスバーが渡されていると想定できますが、別のキャッシング要件を扱うここにいくつかの複雑さに自分自身を購入することができ - 。期間中の分散や汚れ取り扱い。おそらく、プラットフォーム上のURLのキャッシング(いくつかの人々が途中で見つけた)のキャッシュに頼るのに十分です。
    • ネットワークの接続を処理します。これは繰り返して複雑です。一般的なソリューションのための完璧な候補。
    • UIを更新する...データを返信し、データの表示やフォーマットに関する決定を個々のクライアントに延期する方がよいでしょう。
    • メインメモリの内容 - 上記のキャッシングを参照してください。

    潜在的な入力にあります。

    • コンテンツを表示する場所 - 上記のデータを参照し、プレゼンテーションの選択をクライアントに延期する。
    • 私は進行状況インジケータのUI要素、つまりパフォーマンスの良い進行状況バーを表示します。失敗のコミュニケーションに関しては、あなたが公開するCompletedイベントでこれを実装することを検討します。次に、パラメータを使用して結果を伝え、クライアントに処理を延期して、その結果をいくつかのプレゼンテーションコントロール/ログ/その他に配置することができます。これは.Net Frameworkで使用されるパターンと一致します。
    • URI - はい、これが渡されます。
    • パースする方法 - ストリームまたは文字列をクライアントが型を決定できるオブジェクトに変換するデリゲートを渡すことは意味があります。
    • キャッシュの位置 - この問題を一般化するか、パスをハードコードする場合は、これを渡すことができます。渡された場合、他の人にはもっと便利になります(フォルダー/作成を処理するかどうかを検討する)。

    実装について。

    • あなたがその前提条件に縛られている場合は、UserControlを使うことができます。データ表示とステータスメッセージの両方に対してクライアント上でプレゼンテーションをプッシュし、渡されたときに進行状況バーの非表示/表示を制御する方が、柔軟性が高くなります。
    • おそらく、ステータスメッセージが(渡された場合は)テキストブロックに常に表示され、各クライアントからのハウスキーピングをジェネリッククラスに移すと考える限りです。
    • 私はあなたがデータフォーマットとプレゼンテーションを結合しないことによって恩恵を受けると思う。
    • 墓石の処理ここでは、URLのキャッシュを構築したプラットフォームでいくつかのテストを行い、一般的なケースで持続時間/汚れの状態がわかるかどうかを確認します。

    これは、あなたが考えているいくつかの事柄を示し、正しい道を進んでいると確信していることを願っています。あなたはこれについて行くことができる多くの方法があります。最終的にあなたの目標によって推進される最善の道はどれですか。

    +0

    洞察力のあるコメントありがとうございます。あなたは、プラットフォームに組み込まれたキャッシングについて言及します。これは正確に何ですか? –

    +0

    この投稿は、人々がそこで扱っていることを知っています。http://forums.silverlight.net/forums/p/115871/262895.aspx –

    2

    私は基本的に既存のREST APIのクライアントであるWP7アプリケーションを開発しています。サーバーはJSONでデータを返します。ライブラリJSON.NET(http://json.codeplex.com/)の助けを借りて、.NET C#クラスに直接デシリアライズすることができました。

    私はアプリケーションのオフラインシナリオを処理するためのデータをローカルに保存し、ユーザーがアプリケーションを起動するたびにサーバー上で呼び出しを防止します。私はデータをリフレッシュする2つの方法を提供しています:手作業および/またはある期間の後。 Sertling(http://sterling.codeplex.com/)を使用してデータを保存するには、Silverlight/WP7用のシンプルで使いやすいローカルデータベースです。

    最大の課題は、サーバーとの非同期通信を処理することです。私は、何が起こっているのかをユーザーに知らせるために、明確なUIフィードバック(Progressbarやローディングホイール)を提供します。

    私はMVVM LightツールキットとSLユニットテストを使用して統合テストを行っています。View Model =>私のローカルクライアントコード=> Server。 (http://code.google.com/p/nunit-silverlight/wiki/NunitTestsWp7)

    関連する問題