インターネットで見たWPFMVVMアプリの例では、VMを、外部ライブラリからの「古い」イベントを使用するサービスレイヤーと対話するレイヤー、またはHTTPなどを使用してWebと対話するレイヤーと見なしています。しかし、すべてのM、V、VM、サービス、およびその他のパーツを自分で構築するとどうなりますか?サービスレイヤーとビューモデルレイヤーの間の相互作用を適切に構築するにはどうすればよいですか?サービスに入れObservableCollection<OrderModel>
て、ビューのビューモデルからそのまま返すことはできますか、それとも悪いアプローチと見なされ、より良い代替手段がありますか?
3 に答える
あなたはこれを行うことができます-もちろんあなたはできます。このようなことを行う主な理由は、複数のWPFアプリケーション間での重複を減らすことです。
ただし、サービスレイヤー/データレイヤーの実装によっては、一部のシナリオで発生する可能性のある課題は、データベース接続を使用する長時間実行サービスです。ObservableCollectionsは、アプリケーションによって行われた変更をデータストアに自動的に同期するサービスレイヤーを持つという観点から魅力的です。ただし、データ自体に起因する変更を伝達する場合(つまり、データを作成/変更する他のプロセスに応答して)、複雑になります。
サービスレイヤーは、参照の唯一の所有者ではなくなったため(つまり、大規模な変更の場合)、実際にはインスタンスを置き換えることはできませんが、インスタンスを置き換えると、バインディングがほとんど壊れてしまいます。 UIはコレクションにあります。
したがって、1つのインスタンスを最新の状態に保つことに固執します。サービスがデータベースにバインドされている場合、サービス内で長時間実行される監視プロセスの形式をコード化しない限り、ディッシュされた後にObservableCollectionを最新の状態に保つ唯一の簡単な方法は、データベース接続を保持することです。コンテキスト(Linq to SqlまたはEFの場合)が開いている-そうでない場合、関連するオブジェクトなどを取得できないため(すべてのオブジェクトを一度に読み取るように強制しない限り-スケーラブルではありません)。
さて、接続を管理できる何らかの形の管理レイヤーを作成することは可能ですが、避けられないポーリング、または使用する可能性のあるSQL Server通知に加えて、コードが非常に複雑になる可能性があると思います。
とは言うものの、それは本当に依存します-その特定の問題は注意すべき問題ですが、それはあなたがそのようなことは単に問題ではないアーキテクチャと環境を持っているかもしれません。
私のアドバイス、あなたがそれを試してみたいのなら、どうぞ。私のため?私はそれについて考えました-そしていくつかのドメインモデルにINotifyPropertyChangedを追加することを超えて、私はアプリケーションがそれ自身のVMを持っているという考えに固執します。複数のアプリケーションが同じVMを共有する場合がありますが、それはサービスレイヤー自体の内部にはありません。
サービス層は、通常は1回限りの方法でデータとビジネスロジックへのアクセスを提供します。VMパターンのクラスは、はるかに長い寿命を持つことを目的としています。特に、将来のすべてのアプリケーションで発生する可能性のあるすべての問題を解決するために、長時間実行されるサービスレイヤーをコーディングするのは非常に難しいことで有名です。必然的に、単一のアプリケーションのサービスレイヤー内でサービスまたはVMタイプをコーディングすることになります。その場合、そのアプリのコードベースに含まれている可能性があります。
ObservableCollectionは、「監視可能な」側面が関連するポイントからのみ使用したいと思います。これは通常、VMがVに何かを公開していることです。スタックのさらに下(つまりM)に固執したくなるでしょう。リストやコレクションなどのより一般的なものを使用します(特に必要な場合を除く)。いずれの場合も、VMが古いIEnumerableに基づいてObservableCollectionを作成するのは簡単です。
ただし、特にSystem.Collections名前空間でのObservableCollectionの配置は、Microsoftがこれを特殊なクラス(および確かにwpf固有ではない)とは特に考えていないことを示唆しているため、合理的な質問です。
私はいくつかの理由でそれをしません。それらはここに文書化されています:観察可能なコレクションの一般的な間違い
作者は、サービスレイヤーでの使用を含め、人々が犯すいくつかの間違いを経験します。