3

私は古いSL4/riaアプリを持っていますが、それをそよ風に置き換えたいと思っています。メモリの使用とキャッシュについて質問があります。私のアプリはジョブのリストをロードします(一般的なユーザーはこれらのジョブの約1,000にアクセスできます)。さらに、かなりの数のルックアップエンティティタイプがあります。これらがクライアント側で適切にキャッシュされていることを確認したいのですが、セッションごとに更新されます。ユーザーがジョブを開くと、ジョブの複数のマトリックススタイルのビューを構成するさらに多くの関連エンティティ(200〜800の追加エンティティ)が読み込まれます。ユーザーは、ジョブのリストを表示したり、ナビゲートして一度に1つのジョブを表示したりできます。

私はメモリ管理に関心を持つべきだと感じています。特に、ブラウザがこれをどのように処理するかを知らないのです。もともと、これはすべて1つのEntityManagerである必要があり、ユーザーがジョブから離れるときにEntitiesを切り離すと思っていましたが、意図した存続期間までに複数のマネージャーから恩恵を受ける可能性があると考えています。または、ユーザーが新しいハッシュ'/#/'領域に移動するたびに、新しいdataserviceとEntityManagerを作成する必要があります。これは、clear()に関するコメントが、これがより高速であることを示しているように見えるためです。これを行った場合、エンティティの変更を他のビューモデルに通知するためにpub / subを使用すると思いますか?これは複雑に見え、コンテキストとしてのそよ風の利点のいくつかを打ち負かします。

これについてのヒントや考えは大歓迎です。

4

1 に答える 1

8

私はその質問を理解していると思います。私はマルチマネージャーアプローチを使用すると思います:

  1. Lookups Manager-セッションごとに1回の参照(ルックアップ)エンティティを保持します
  2. JobsViewManager-JobsViewをサポートするジョブの「読み取り専用」リスト
  3. JobEditorManager-編集セッションごとに1つ。

Lookups Managerは、参照エンティティの正規のコピーを維持します。サーバーへの1回の呼び出しで1回入力できます(方法については、ドキュメントを参照してください)。このルックアップマネージャーは、これらの参照エンティティを他のマネージャーにBreezeエクスポートし、作成時にBreezeインポートします。私は、多数の多様なものの、参照エンティティの合計メモリフットプリントはかなり低いと想定しています...複数のマネージャに複数のコピーを持つ余裕があるほど十分に低いです。そうでない場合は、より複雑な解決策があります。しかし、それは今のところです。

JobsView Managerには、表示に必要な参照エンティティがあります。ジョブの予測のみを表示した場合、キャッシュにはジョブがありません。代わりに、配列とキーマップがある場合があります。シンプルに保ち、すべてのジョブが含まれているが、関連するエンティティは含まれていないと仮定しましょう。

このマネージャーで変更を保存することはありません。ジョブを編集または作成するとき、アプリは常に独自のVMとJobEditorManagerを備えた「ジョブエディター」ビューを起動します。ここでも、必要な参照エンティティをインポートし、既存のジョブを編集するときに、ジョブもインポートします。

私はとにかくこのアプローチを取ります...メモリの問題だけではありません。編集セッションをサンドボックスに分離するのが好きです。キャンセルを容易にします。アプリ/ブラウザーがダウンした場合にユーザーが作業を失うことがないように、ブラウザーのストレージに保留中の変更を保存するためのクリーンな方法を提供します。複数のジョブを同時に編集するための扉を開きます...変更のある相互に依存するエンティティについて心配する必要はありません。これは、SLアプリで永遠に使用されてきた実証済みのパターンであり、JSアプリにも適用されるはずです。

ジョブの編集が成功したら、ローカルクライアントの世界にそのことを伝える必要があります。それを行う方法はたくさんあります。知る必要がある唯一の場所がJobsViewである場合は、アプリにバックチャネルをハードコーディングできます。もっと賢くなりたい場合は、特に仕事の節約に関するイベントを発生させる中央シングルトンサービスを利用できます。JobsViewと新しい各JobEditorは、このサービスと通信します。そして、ヒップになりたい場合は、この目的のためにインプロセスの「イベントアグリゲーター」(パブ/サブ)を使用します。とにかくこのアプリにはおそらくDurandalを使用していると思いますが、ボックスにはイベントアグリゲーターが含まれています。

正直なところ、使用するのはそれほど複雑ではなく、マネージャー間でエンティティをインポート/エクスポートするのは...エム...簡単です。ジョブリストに戻るたびに更新するのと比較すると、それだけの価値があります(ただし、他のユーザーがそれらのジョブを追加/変更する可能性があるため、「更新ボタン」も必要になります)。クエリ、検証、変更の追跡、バッチ保存、エンティティナビゲーションなど、Breezeの多くの利点を保持します(これらの参照リストはBreezeでは「無料」で機能します)。

改良点として、JobsViewに戻ったときにJobEditorビュー/ビューモデル/マネージャーを自動的に破棄するかどうかはわかりません。私の経験では、人々はしばしば彼らが去ったばかりの同じ仕事に戻ります。あなたが素早く行き来できるように、私は眺めを保持するかもしれません。しかし今、私はトリッキーになっています。

于 2013-01-28T20:05:18.937 に答える