MVCの私の最初の試み。 simpleの例を実装しようとしています。 here からのインスピレーション。このパターンを(まだ!)持っていますか?
ビュー:「やあ、コントローラー、ユーザーが最初の人が欲しいと言ったばかりだ」
コントローラー:「うーん、資格情報を確認したら、彼はそれを許可されています...ねえ、モデル、私に最初の人を手に入れてほしい」
モデル:「最初の人が...それを手に入れました。あなたに戻って、コントローラー。」
コントローラー:「ここで、新しいデータセットを収集します。戻って、表示します。」
表示:「クール、最初のユーザーをユーザーに表示します。」
見る:
namespace WinFormMVC
{
public partial class Form1 : Form
{
controller cont = new controller();
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = cont.checkPermissionsAndGetFirstPerson();
}
}
}
コントローラ:
public class controller
{
public string checkPermissionsAndGetFirstPerson()
{
string returnValue = "";
if (checkPermissions())
{
model m = new model();
returnValue = m.getFirstPerson();
}
return returnValue;
}
public bool checkPermissions()
{
return true;
}
}
モデル:
public class model
{
public string getFirstPerson()
{
return "Bill Smith";
}
}
うーん...このMVCを呼び出すかどうかはわかりません... ASP.NET WebFormと同様に、このフォームはMVPパターンに似ています。
私の理解によると、MVCでは、コントローラーはすべてのリソースとコードのフローを管理する役割を果たします。この例では、基本的にWindowsフォーム(ビュー)を最初に作成してから、コントローラーをMVPに近いものにアタッチします。
従来のMVCパターンでは、インスタンス化されたモデルはビューにリンクされ、モデルが変更されると、ビューに通知が送られます(おそらくObserver/PubSubパターンを介して)。
ビューからのボタンクリックなどは、これらの種類のものを調整するコントローラーにルーティングされます。
this を参照してください。
MVCは次のように説明します。
リクエスト(MVC urlルーティング、以前のUIから渡されたイベントなど)
コントローラー-資格情報の確認、データの取得、モデルの返却
モデル-コントローラーから返されたデータを表します
表示-コントローラーから返されたモデルをレンダリングします。モデルによっては、新しいコントローラーアクションを初期化するUIが表示される場合があります。モデルを次のコントローラーアクションに戻すこともできます。
多くのモデルの実装(Linqなど)でデータ定義とアクセスを提供するため、少し混乱する可能性があると思いますが、開始点を知っているのは依然としてコントローラーです(それ自体が変更を保存する方法を知っているのはモデルであっても) 。
したがって、コードは次のようになります。
//Controller:
public class PersonController
{
public PersonAction Detail(int personId)
{
Person returnValue;
//get person from DB and populate returnValue
return new PersonAction( returnValue );
}
}
//Model:
public class Person
{
public string FirstName {get; set;}
public string LastName {get; set;}
}
//View:
public partial class PersonDetailView : MVCForm<Person>
{
public Form1( Person model ):base(model) {
textBox1.Text = model.FirstName + " " + model.LastName;
}
private void button1_Click(object sender, EventArgs e)
{
textBox1.Text = model.FirstName + " " + model.LastName;
}
}
この例に欠けているのは、これをすべて可能にするフレームワークです-それには2つの重要な部分があります。
パラメータを取得/解析し、それに基づいてコントローラのアクションメソッドを呼び出すもの。たとえば、Asp.net MVCの場合、これはルーティングハンドラーです。上記の呼び出しはリクエストURLです:〜/ Person/Detail/personId
アクションの結果(上記の例ではPersonAction
)を受け取り、表示する正しいビューを見つけるもの。この例では、PersonDetailView
フォームを開き、Person
モデルを渡します。
WinFormsのMVC実装には多くのサンプルフレームワークがあります。そのうちの1つが出発点として適しています。
あなたの物語にいくつかの修正を加える必要があると思います。簡潔に言えば、ビューはコントローラーに接続せず、ユーザーはコントローラーに直接接続します。 Webアプリでは、このように見えます。
ユーザー:ちょっとWebアプリ、/ people/1にリソースを持っていますか
ルーティングエンジン:それはあなたがコントローラーを意味します。最初のユーザーを取得します。
ユーザーコントローラー:モデル。認証されたユーザーのユーザーレコードと、最初の人物の個人レコードを取得する必要があります。
ユーザーコントローラー:そうです。認証されたユーザーが管理者であり、個人が存在することは知っています。そのため、個人の管理ビューをユーザーに戻します。
レンダリングエンジン:ビュー(テンプレート)および人物オブジェクト(データ)からhtmlを構築します
これは、ウェブフォームで行うのは困難です。最善の方法は、各コントローラーのページを用意し、そのページでユーザーコントロールを動的に選択して表示することです。ビューごとに1つ。 MVCでは、ビューが愚かであることが重要です。すべての要求はコントローラーによって直接処理され、コントローラーは使用するビューを選択します。
MVCパターンを採用するには、次を実装します。
Observer パターンのようなものをこのタイプのシステムに統合して、モデルがビューに変更を通知できるようにして、ビューがそれに応じてそれ自体を更新できるようにするジミーに同意します。
MVPとの違いは、Viewに代わってModelを監視するPresenterクラスを導入することです。つまり、ViewはModelを認識せず、Presenterのみを認識します。プレゼンターはモデルの変更に応答し、それに応じてビューを更新します。
あなたのcheckPermissionsAndGetFirstPerson
メソッドはおそらく多すぎます。認可とデータの取得は、おそらく別個の操作である必要があります。
また、Form1
クラスはビューであり、おそらくコントローラーを構築するべきではありません。それは逆に思えます。
.NETのMVCで見つかるほとんどの情報は、ASP.NET MVC Webアプリケーションに関するものです。 CodePlexのWinFormsMVCプロジェクトをチェックして、他の誰かがこの問題にどのように取り組んでいるかを確認することをお勧めします。
http://winformsmvc.codeplex.com/
CodePlexでの別のWinForms MVC実装を次に示します。もう少しドキュメントがあるようです。
このチュートリアルは非常に役立つことがあります: http://nerddinnerbook.s3.amazonaws.com/Intro.htm 。 Scott Guthrieによって書かれ、MVCワークフローを非常によく説明しています。パート4には、探している基本事項が含まれているはずです。