0

このトピックは広範に思えるかもしれませんが、データ駆動型アプリケーションの適切なアーキテクチャとWPF手法の概要を探しています。

Accessデータベースに接続されたデータ集約型アプリを構築しています。画面上のデータには常にいくつかのビューがあり、ユーザーがいずれかのビューを操作することを選択すると、それらはすべて動的に更新されます。ビューの1つは3Dマップです。他のビューには、いくつかのグラフ(D3)、データグリッド、および長方形と円を使用してプログラムでデータを描画するキャンバスが含まれます(キャンバスのOnRenderをオーバーライドします)。

私の現在のデータモデルは私の最初の試みであり、かなり遅いようです。基本的に、ユーザーがキャンバスを操作すると、新しいクエリがAccessデータベースに送信され、Accessデータベースは、すべてのビューに描画する新しいデータセットを返します(OleDBDataAdapterを使用)。これはかなり遅いです。特に、キャンバスをズームインおよびズームアウトする場合。

データベースとリアルタイムでやり取りし、すべてのビューに遅れることなくデータを描画できるものを望んでいます。この種のアプリケーションがWPFで不可能な場合は、後でではなく早く知っておくとよいでしょう。しかし、私はただ間違ったことをしていると思います。

ですから、誰かが以前にこの種の問題に取り組んだことがあり、私が正しい方向に向かうのを助けることができることを願っています。

4

2 に答える 2

1

私がこのプロジェクトを始めてからほぼ2年になります。私たちは新しいWPF開発者を雇って、それを正しい方法で軌道に乗せるのを手伝ってくれました。それ以来、それは私の会社で最も成功したソフトウェアプロジェクトの1つになりました。学んだことを学んだ後、自分の質問に正しく答える方法がわかりました。したがって、この回答は2年前の私にとってのものであり、WPFプロジェクトを始めたばかりで、彼らが何をしているのかわからない人もいます。

このプロジェクトを開始する前は、 MVVM(Model-View-ViewModelパターン)について何も知りませんでした。実際、私が最初に質問をしたとき、誰も私にこれについて言及しませんでした。これは、すべてのWPFプロジェクトに必須です。あなたがそれを忠実に守れば、それはあなたのコードベースを整理してテスト可能に保ちます。

私のプロジェクトでは、MVVMのモデルはデータベースと通信するレイヤーです。当初は、データベースを常に開いたままにし、データが必要になったときに常に照会するという計画でした。結局、データの量が非常に少なかったため、データをメモリにロードしてデータベースを閉じました。データをどのように操作するかに関係なく、プログラムの残りの部分はデータがどこから来たのかを気にしません。モデルにデータを要求するだけで、提供されます。

ViewModelは、各UIピースのバックエンドです。たとえば、グラフを表示している場合、ViewModelは、このグラフに表示するために必要なデータを含むオブジェクトです。ViewModelはモデルと通信して、必要な情報を取得します。これはC#で書かれています。

ビューは、グラフを含むUIコンポーネントです。これはXAMLで記述されており、データバインディングを使用して、ViewModelとの同期/通信を維持します。データバインディングは、MVVMパターン全体の鍵です。

単純なデータ視覚化プログラムには、それぞれ独自のViewModelを持つ10個の異なるビューがある場合があります。(各ビューとビューモデルを個別のファイルに配置することをお勧めします。実際、プロジェクト全体をいくつかの小さなプロジェクトに分割することをお勧めします。1つはUI(すべてのXAMLファイル)用、もう1つはViewModels(C#バックエンドコード)用です。 )、1つはモデル(データレイヤー、おそらくC#)用、もう1つは一般的なユーティリティ用など)

データの視覚化に関しては、速度と使いやすさからVisibloxを使用することになりました。Visibloxグラフは、ViewModelsへのデータバインディングとともに、それぞれのビューに含まれています。Visibloxのものに加えて、DataGridsと標準の入力/出力コントロールも使用しました。これらはすべて、データを表示するための単なるUIコンポーネントです。

このアーキテクチャの良いところは、ViewModelsが単にデータを表し、Viewsがそのデータの視覚化を表すことです。それらは互いに完全に離婚しているため、ユニットテストは簡単です。

既存のMVVMフレームワークのいずれかを使用するか、私たちが行ったように独自のフレームワークを作成することをお勧めします。

明らかに、この答えに追加できる情報の教科書の価値があります。これは、MVVMがどのように機能するか、および2年前に自分の質問にどのように答えたかを簡単に説明することを目的としています。

于 2014-03-17T17:23:03.023 に答える
0

現在行っているのは、新しいクエリを実行してから、データに基づいて新しい「ビューモデル」オブジェクトを作成することです。これにより、データテンプレートを使用して新しい視覚要素が作成されます。データセットのサイズを大きくし、視覚化の複雑さを増すと、これはかなり遅くなる可能性があります。

クエリが一貫した構造のデータを返すと仮定すると(各クエリの後にほぼ同じ方法でモデル化される)、オブジェクト構造を保持できるため、新しいオブジェクト全体を構築するのではなく、ビューモデルのプロパティのみを変更できる場合があります。毎回階層。これははるかに高速ですが、クエリ結果の新しいビューモデルを作成するだけでなく、クエリ結果に基づいてビューモデルを更新するための中間作業を行う必要があります。

詳細は、特定の問題に非常に固有のものになります。私があなたがしていることを完全に誤解した可能性もあります。

于 2012-05-22T19:03:09.723 に答える