MVVM:モデルとのviewmodels間の通信
-
25-09-2019 - |
質問
私はMVVMパターンを使用してWPFアプリケーションを開発しています。 (私はNinjectとユニティを検討している)私はMVVMライトライブラリを使用していると私も依存インジェクタを使用しようとしています。
私は、ブログの記事をたくさん読んでいると私は非常に私のクラスは、相互に通信することの「正しい」方法について混乱しています。特に、私はMediatorパターンに依存する依存性の注入を使用したときにしたときに知りません。
の例を考えてみましょう。私はViewModelにを持って、DataViewModelそれを呼び出すことができますし、データのいくつかの種類を提供するデータクラス。 それはどのようにそれらの間で通信することをお勧めします:
A。 IDATAのインタフェースでDataViewModelへの依存性を注入?この方法でデータがメッセンジャーに依存する必要はありませんが、データが変更された場合には、イベントを提供しなければならない、とのViewModelがそれに加入する必要があります。
B。 Mediatorパターンに依存している(メッセンジャーとしてMVVMライトで実装)とモデルとビューモデルの間でメッセージを送信しますか?全体の通信はメッセージに基づいて行われますので、この方法は、すべての依存性注入を使用する必要はありません。
また、私のviewmodelsは他のviewmodels上の依存関係を注入している必要があります、またはそれはちょうどメッセンジャーに頼る方が良いでしょうか?最初の場合は、各ビューモデルのために別のインタフェースを定義する必要がありますか?私は、各VMのためのインタフェースを定義することは、追加の作業になると思うが、多分それは価値がある。
解決
一般のViewModelは、それが必要なデータを取得するために(プリズムはそれを呼び出すよう)サービスに行きます。あなたが別の方法のServiceLocatorを経由して、これを実行する可能性があるが、そのサービスは、(コンストラクタ・インジェクション)DI経由のViewModelにプッシュされます。
そのため、あなたのViewModelはあなたのデータの検索離れ意志抽象サービスへの参照を保持します。データが知っているDB、XMLファイルから来ることができ...抽象概念があります。だから、IDATAのあなたのケースのために、その型への参照は、DIのからのいずれかの方法でのViewModelの中でいくつかの点で発生しなくなります。あなたのIoCフレームワークは、(プリズムはありません)あなたは、コンクリートの型へのインタフェースの種類のマッピングを作成し、あなたのコンテナを経由してこれらのタイプを取得し、それを許可している場合。このようUnityとケースがあります。
ここでは簡単な例です...スクリプトは、ビューにバインドされているとのViewModelはビュー内に注入されます。データを取得するIScriptServiceの使用を注意してください。戻ってくるデータは、我々は壮大スケールの種類を気に単一のエンティティとしての種類を気にしないので、しかし、我々は正式のViewModelにその種類を注入したことがないのiScript型のコレクションです。
public ScriptRepositoryViewModel(IUnityContainer container, IScriptService scriptService, IEventAggregator eventAggregator)
{
_container = container;
_scriptService = scriptService;
_eventAggregator = eventAggregator;
}
public ICollectionView Scripts
{
get
{
if (_view == null)
{
_view = CollectionViewSource.GetDefaultView(_scriptService.Scripts);
_view.Filter = Filter;
}
return _view;
}
}
あなたがビューにあなたの方法を確認すると、、同じケースがあったことができ、ビューはViewModelにでDI(コンストラクタ・インジェクション)を介して注入されます。私は孤立それらを保つ、他のviewmodelsが相互に依存することはないだろう。あなたが共有しようとしているデータを見てみ結合するための必要性を見始める場合は、より頻繁にして、そのデータのニーズにどのViewModelにに結合されてしまう、さらにはなく抽象化される。
他のヒント
あなたの問題に複数の良い解決策がある、
私は、あなたがあなたのデータモデルでは、いくつかの単一のインターフェイスを使用することをお勧めベースクラスに入れて、このインタフェースは、データが外の世界と通信するオブジェクトをできるようになります。
ビューモデルはデータが、あなたのためのデータを取得することができないインターフェースを注入するために、彼はそれらを取得した後、VMがそれらに登録できるというイベントを公開しますデータます。
は彼を保持している人知っているべきではありませんojectデータは、ビューモデルは、彼が保持するデータの種類を知っているが、私は原因の柔軟性の問題のために、このデータを注入することをお勧めいけない。