2012-12-13 23 views
6

私は次のようになりますWPFアプリケーションを持っている:WPF、MVVM、ICommandの、およびリポジトリ

enter image description here

のviewmodelは、モデルをラップし、INotifyChanged経由ビューに関連するすべての属性を公開します。ビューは、ビューによってトリガーされた特定の動作を処理するいくつかのICommandオブジェクトにもバインドされています。私は、モデルをデータベースに保存することを唯一の目的とする外部のICommandを持っています。

私が読んだことは、ビューまたはビューモデルのどちらもリポジトリへの参照を持たないことを示しています。これが、ビューモデルの外にあるコマンド3の理由です。

私の質問は二重です。まず、これは合理的なアーキテクチャーです。次に、モデルインスタンスをコマンド3に渡してリポジトリに入れることができる良い方法は何ですか?

+0

VMの 'Command 1'と' Command 2'とVMの 'Command 3'はどのくらい正確にOUTですか?すべてのコマンドが独自のクラスで個別に実装されているわけではなく、そのプロパティとしてVMに「追加」されているだけですか?このコンテキストでは、VM内の1つのコマンドとVMの別のコマンドはどのようにして動作しますか? –

答えて

8

個人的には、ViewModelにリポジトリへの参照があることに問題はありません。これを回避しようとすると、不要な合併症が発生します。

MVVMでは、ViewModelは通常、モデルの上にある「グルー」レイヤーであり、リポジトリはモデルの一部です(ドメイン固有のデータ/ロジックの一部です)。 VMにコマンド3を置くことによって、直接リポジトリとVMの仕事は、おそらくそれを分離しようとするよりもきれいになりまかせ

MVVM Diagram

:私は個人的にこのことについてどのように考えるかの私のblog series on MVVM shows a good image

+0

私は、Reedが言ったことをちょっと追加します:あなたが望むなら、あなたのリポジトリの詳細を抽象化することによって、それを幾分デカップリングすることができます。しかし、私は同意する、彼らの図が示すように完全に分離する理由はない。 – Tim

+0

@Tim良い点。リポジトリの詳細を抽象化することは非常に便利ですが、ほとんど問題はありません(テスト容易性などに優れています)。 –

+0

私はそれが別の問題のようなものであることに同意しますが、そのような抽象化がOPの聴聞会の背後にある理由であったのかもしれないと思っています。ちょうど答えの種類にしたいと思っていた "なぜ私はする必要がない場合、私はそれを行う必要があると誰も言う?彼はそれに尋ねる前に質問をする! – Tim

0

ビューモデルは、リポジトリではなくビジネスレイヤ(ドメインオブジェクト+ドメインサービス)と直接通信する必要があります。さらに、この通信はコマンドを介して行う必要があります。

だから、あなたが持っている:

ビュー - >表示モデル - > [コマンド] - > [ドメインオブジェクト/ドメインサービス - >リポジトリ

をあなたが本当に簡単なCRUDアプリケーションを開発している場合を除き...

関連する問題