MVVMの明確化


15

最初のWPFアプリケーションを作成しようとしており、MVVMパターンに精通しています。私たちは多くのWinformアプリケーションを構築しており、非常に成功したアーキテクチャを持っています。そのアーキテクチャを翻訳したり、アーキテクチャの特定の部分がMVVMモデルに適合する場所を決定したりするのに少し苦労しています。

歴史的には、BusinessLogic dllと通信するGui(メインexe)があります。BusinessLogicはWebサービスを介してDAL dllと通信し、DALはDBと対話します。DAL、BusinessLogic、およびGUIはすべて同じBusinessObjects dllを参照します。

AsIsアーキテクチャ

MVVMへの移行の一部はかなり単純です。Guiにはビューが含まれ、BusinessOjbectsにはモデルが含まれ、DALはDBと対話します(ただし、それらを実装するテクノロジーは変更される可能性があります)。

わからないのは、BusinessLogicコンポーネントです。歴史的には、これはビューのコントロールを呼び出すためにGUIに呼び出す関数を提供していました(つまり、Customerオブジェクトのリストまたは典型的なCRUD関数を返すGetCustomerList)。

主な問題は、MVVMパターンがViewModelを格納するために追加のコンポーネントを必要とするのか、単に考え方を変えてBusinessLogicコンポーネントとして使用したものをViewModelに移行するだけなのか、ということです。

BusinessLogicコンポーネントはViewModelを表しますか?


これは、問題を探す解決策のように思えます。MVVMに移行する説得力のある理由はありますか?私はパターンのファンですが、以前のソリューションは機能していませんでしたか?ビューモデルは、監督するプレゼンターのようなものです。プレゼンテーションロジックが含まれており、データバインディングを通じてデータを表示します。あなたのビジネスロジックを知っていて、その層に手を差し伸べることができるはずですが、私はビジネスロジックをビューモデル自体に崩壊させません。
ジェレミーリクネス

回答:


19

一般的に、ビジネスモデルをビューモデルレイヤーに配置しません。しかし、「ビジネスロジック」という用語は誤解を招くものです。

エリックエヴァンスは、ビジネスロジックが2つのカテゴリに分かれているモデルを使用しています

  • ドメインロジック-解決しようとしている実際の問題ドメインに関連するロジック
  • アプリケーションロジック-アプリケーションを構築しているという事実に関連するロジック

彼は、会計アプリケーションの例を言及しています。アカウント、投稿、税アカウントなどに関するルールは、ドメインルール、アカウンティングのドメインに関連するルールです。CSVのインポート/エクスポートに関するロジックは、アカウンティングのドメインとは関係ありません。これらのルールは、ソフトウェアアプリケーションを構築しているために存在します。これらはアプリケーションロジックの例です。

ドメインルールは、ビューモデルレイヤーに絶対に入れないでください。MVVMパターンに従っている場合、ドメインルールは問題なくモデルレイヤーに移動します。

アプリケーションルールは、CSVのインポート/エクスポートのように、可能性ビューモデル層に行きます。しかし、個人的には、それを個別のアプリケーションロジックレイヤーに分離することを好みます。

ビューモデルは非常にシンプルである必要があります。対応するモデルのビューに必要なデータを検索し、ビューが変更されたときにモデルを更新し、モデル内のイベントをリッスンし、それらのイベントをビューに伝播し、モデルが舞台裏で更新されたときにビューを更新できるようにします(該当する場合)。

個人的には、ビューモデルレイヤーに、プレゼンテーションロジックという1種類のロジックのみが含まれるようにします。


1
素晴らしい答え。ViewModelにプレゼンテーションロジックのみが含まれるようにする点が気に入っています。Eric Evansポイントに関連するリンクを追加できますか?
-user7676

私は彼の本、Domain-Driven Designからそれを手に入れたと思うので、リンクを見つけることができるとは思わない。とにかく、ドメインとアプリケーションロジックの違いの優れた例だと思います。本の詳細はこちらbooks.google.dk/books/about/…–
ピート

5

はい。

ビジネスロジック層はVM層で表されます。したがって、メンタルモデルを移行するだけです。

メンタルモデルの移行を支援するための微妙な違いは、GUI(ビュー)オブジェクトをVMレイヤー内のオブジェクトにバインドすることです。このバインディングは|に変換されます は、ビューが他の何かを取得するために「呼び出しを行う」レイヤーではなくなったことを意味します。データ取得の呼び出しは、代わりにVMから行われます。

わかりやすく説明します。はい、ビュー内のオブジェクトは、呼び出しを行う一連の操作をトリガーするために変更する必要があります。しかし、ビューはそれ自体を呼び出しません。この場合、ボタンのクリックは、ビュー内の何かが変化するのと同等であると考えますが、それでも呼び出しは行いません。

最初のケースでは、そのViewオブジェクトはVMオブジェクトにバインドされます。VMは、バインドされたオブジェクトのプロパティ変更イベントをリッスンする必要があります。その後、オブジェクト変更イベントをVM関数に接続して、モデルを呼び出します。

2番目のケース(ボタンクリックイベント)では、変更(クリック)イベントをVMによって公開される関数呼び出しに関連付けることができます。

いずれにせよ、それは常にVMにシーケンスするイベントであり、次にモデルを呼び出し、次にモデルがDAL / DBを呼び出します。

いくつかのWinFormコードを使用して、WinForm GUIのコードビハインドから直接DBレイヤーへの呼び出しを行うため、これを取り上げます。このアプローチは、MVVMが提供している分離を破ります。


確認してくださってありがとうございます。ビューがViewModelとやり取りする方法のニュアンスを理解し、バインディングモデルを維持し、「呼び出し」を削除します。
-user7676

私はこの答えが賛成票を失ったことに気付きました。ダウンボッターがその理由についてコメントしてくれるかどうか興味がありますか?または、この視点を共有していない場合、独自の回答を追加することもできます。
user7676

1
ビジネスロジック層はVM層で表されることに同意しますが、答えの一部は混乱する可能性があると思います。View層はViewModelにまたはモデルの視覚的な表現であることを意味し、そうではなく、クリックイベントは、VM上の関数呼び出しに配線され、より良い定義がVMでのコマンドは、中ボタンとしてレンダリングされると言うことであろうと言っていますビューレイヤー。私のアプリケーションフローは、一般的に行くので、また、私は一般的に、私のモデル層が直接DALにアクセスできること好きではないVM -> DAL -> DBところ、VMそしてDAL両方の使用のプレーンModelデータオブジェクト。
レイチェル

4
私はこの答えに同意しません。ViewModelはビューのモデルであり、ビジネスロジックではなくビューロジックが含まれています。ViewModelsはプレゼンテーションレイヤーの一部です
-simoraman

1
@simoraman- MVPVMパターンは、あなたが提案しているものと一致しています。MVPVMは良いパターンだと思いますが、小さなアプリには少し重いです。あなたの考えを答えに入れ、この質問に貢献することを本当にお勧めします。

5

基本的に、BusinessLogic dllをViewModelレイヤーに置き換えることは正しいですが、直面する最大の違いは、View / UIレイヤーがViewModel / BusinessLogicレイヤーと対話する方法だと思います。

WinFormsでは、GUIがアプリケーションであり、アプリケーションフローを担当します。WPF / MVVMでは、ViewModelはアプリケーションであり、GUIはViewModelとやり取りするためのユーザーフレンドリーなインターフェイスになります。

たとえば、WinFormsでは、DataGridとButtonがあり、そのButtonをクリックするBusinessLogicLayer.GetProducts()と、結果のProductオブジェクトを呼び出してDataGridにロードします。

WPFでは、ObservableCollection<Products>とを含むViewModelがICommand GetProductsあり、コマンドを実行するとDALが呼び出され、製品のコレクションがロードされます。ただし、これにユーザーフレンドリーなインターフェイスを提供するには、ProductsコレクションにDataGridを使用し、GetProductsコマンドにButtonを使用してViewModelをレンダリングするViewを作成します。

私は実際、ブログでWinformsからWPFに移行するときの考え方の変化についてかなり最近のブログに投稿しました。違いを要約する最良の方法は、これらの写真を使用することです。


1
私はGlenH7に同意します。これはWPFを始めた人にとって良い答えです。ViewとViewModelの間の相互作用のパラダイムシフトが得られるので、これは実際に私が尋ねた質問のトピックではありませんでした。
user7676
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.