私はデザインパターンの初心者です。新しい話題のMVVMを聞いているとき、MVCの学習を始めました。
古い在庫を再設計し、クライアント用に開発したアプリケーションに請求書を発行することで、これら両方の洞察を学びたいと思います。 WindowsベースのWPFアプリケーションとWebベースのバージョンの両方を書きたいのですが。可能な場合は同じクラスのセットを使用したいと思いますが、そうでない場合は、少なくともほとんど変更を加えません。
私はいくつかの記事を読みましたが、そこで議論されている.NET 3.5&4のアーキテクチャと高レベルの概念に従っていません。自分の実際のプロジェクトで本当に必要なものだけを設計することによって、段階的に移動したいと思っています。
MVVMへの簡単な段階的な参照はありますか? MVVMはMVCのスーパーセットですか、サブセットですか?最新のパターンと、アプリケーションのWindowsバージョンとWebバージョンのどちらを選択する必要がありますか?
ビューに接続する必要がほとんどない特定のクラスがあります。その場合、MVVMの方法で同じクラスを設計することは、追加の労力であることがわかります。
MVVMへの簡単な段階的な参照はありますか?
はいあります。 こちらをご覧ください。
MVVMはMVCのスーパーセットですか、サブセットですか?
MVVMはMVCファミリーに属しているので、少し言えばサブセットです。これは、UIをその下のビジネスロジックから切り離すバリアントです。私はそれをMVCの兄弟として説明します。 OOPの初期の頃から、UIをロジックから切り離す方法を模索してきました。MVCは進化した最初のアーキタイプでした。非常に単純ですが、ほとんどの人は正しく理解していません。ビューはモデルの単なるオブザーバーであり、必要に応じてそれを呼び出します。コントローラーは、ビューがモデルと通信するための戦略にすぎません(たとえば、交換可能な動作が必要な場合(つまり、ReadonlyController、AdminController)。MVCは非常に成功しています。それを適用することは本当に良い習慣です。
MVVMは、特別な種類の Martin Fowlerによって記述されているMVPパターン です。 MVPは(ユーザー入力などを取りながら)ビューを可能な限り簡潔に保ち、テスト容易性を向上させます。これは、ビューの抽象化とプレゼンターに挿入する対話ロジックを目的としています。プレゼンターはモデル/ビジネスロジックとのみ通信し、ビューを更新します。 Martin Fowlerは、彼のプレゼンテーションモデルパターンでMVVMをかなり説明しています。
ビューは完全にViewModelに抽象化されています。 View
にプロパティが必要な場合、ViewModel
にもプロパティが必要です。これ(ViewModel)は、基礎となるUIテクノロジー、つまり抽象化から完全に独立していることを意図しています。 ViewとViewModelの間で通信するには、同期パターンを使用する必要があります(つまり、オブザーバー)。これは、ステートレスWeb環境で達成するのは容易ではありません。 MVVMはMVPとは異なります。ビューはモデル/ビジネスロジックにバインドせず、代わりにViewModelにバインドするためです。
最新のパターンと、アプリケーションのWindowsバージョンとWebバージョンのどちらを選択する必要がありますか?
理論的には、プレゼンテーションモデル(MVVMのような)は、使用しているUIテクノロジから完全に独立している必要があります。ただし、同期化の側面をカバーする必要があります。これは、同期のりが既に存在するWPFでコマンドとプロパティにバインドすることで簡単に実行できます。 ASP.NETでは、これは別の話です。ただし、すべてのWindows UIテクノロジでプレゼンテーションモデルパターンを使用した CodeProjectに関する記事があります 。見てください。
ライフサイクルの問題とページの投稿間で状態を維持する必要があるため、WebとWPFの間でUIコードなしの100%を再利用するのは非常に困難です。 Asp.netには、MVVMに必要な強力なデータバインディングがありません。また、ポストバックの必要なしにUIが自己を更新することを期待しているため、最近では多くのロジックをjscriptで実行する必要があります。
SilverLightを使用できれば、人生はそれほど複雑ではなくなります:-)
同様に、UIの一般的なビットのために、WPFアプリでWebブラウザーをホストできますか?
ASP.NetとWPFベースのUIに同じクラスを使用するという意図はあまり実用的ではありません。 WebでのデータバインディングとJavaScriptの使用は、WPFとは大きく異なります。私が考えることができる唯一のオプションは 完全に受動的なビューを持つMVP です。理論的には、WebおよびWPFページにデータを入力するのと同じプレゼンターを持つことができます。
実際には、ほとんどのビジネスルールがWebサービスレイヤーと、このWebサービスと通信するビジネスルールをできるだけ少なくした2つの異なるプレゼンテーション層にあるアーキテクチャを開発します。