2009-03-17 26 views
99

WindowsフォームでMVCパターンを完全に実装する良い例はどこにありますか?WindowsフォームでMVCを実装する

さまざまなサイト(例:The Code Projectと.NetHeaven)で多くのチュートリアルとコード例が見つかりましたが、多くはMVCよりもオブザーバーパターンのほうが代表的です。私が開発したいアプリケーションは学校プロジェクトのため、PureMVCMVC#のようなフレームワークを使用することには消極的です。

+1

の可能複製(http://stackoverflow.com/questions/ [どのようにWindowsFormsアプリケーションでMVCを実装するのでしょうか?] 122338/how-you-you-implement-mvc-in-a-windowsforms-application) – nawfal

+1

も参照してください[データバインディングの型を安全にし、リファクタリングをサポートする方法](http://stackoverflow.com/questions/1329138/how-to –

答えて

109

私は、アプリケーションが互いに非常に異なっており、アプリケーションの記述方法についての理解はまだ非常に限られていると考えています。私が取り組んできた過去のWindows Formsアプリケーションは、互いに非常に異なっています。 (ほとんどの組み合わせを含む)されて、私が見てきたデザイン違いの一部:

  • が直接データベース(2層)に話を
  • は、与えられたアプリケーションのために書かれているバックエンド(3段目)
  • を使用します
  • 多くのアプリケーションで使用するために作成されたWebサービスのセットを使用し、アプリケーションでは変更できません。 (サービス指向アーキテクチャ)
  • アップデートは、データのdata binding /なし使用法の使用法のcommand pattern(バックエンドサーバにコマンドを送信)
  • ロットが
  • ほとんどのデータを結合して行われてCRUD操作によって行われて
  • アップデート標準的なグリッドコントロールでうまく動作する/ほとんどのUIデータのカスタムコントロールが必要な「表のような」(たとえば請求書など)モックなどを使用して(ちょうどUI上)10のまたは20の開発者の
  • 一つの開発者/チームユニットテストの
  • ロット/何の単位は

ので、私はそれが1つの実装を作成することはできないと思いますがテストしませんいつもうまく収まるMVC(またはMVP)の

私は MVCと MVCシステムは、それがある方法を構築している理由を説明する本当に見た中で最高のポストは、"Build Your Own CAB" series by Jeremy D Millerです。あなたはあなたのオプションをもっとよく理解することができるはずですが、それを作業した後。 Microsoft's Smart Client Guidance (CAB/Microsoft Composite Application Block)も考慮する必要があります。それはちょっと複雑ですが、うまくフィットしているアプリケーションではうまく動作します。

MVC/MVP Implementation for a Winforms Projectを選択すると、読む価値があります。 PureMVCのような多くの人。私はそれを一度も使ったことはありませんが、次にMVCフレームワークが必要になったときに見ていきます。

Presenter First」は、MVP(Model View Presenter)デザインパターンとtest-driven developmentのアイデアを組み合わせたソフトウェア開発アプローチです。それはあなたが顧客の言語でテストを書くことから始めることができます。たとえば:

「。私は、ファイルを保存する必要があると 保存されていないファイルの警告が 消えるはず その後、ボタンを 『保存』をクリックし、」

は、私が「プレゼンターファーストを使用しての経験がありません私はチャンスを得るとき、それは非常に有望に見えるように、」私は、それを試してみるだろう。

他のスタック オーバーフローの質問にでherehereをしているあなたが見たい場合があります。

WPFのいずれかを使用することを考えている場合は、Model-View ViewModel (MVVM)パターンをご覧ください。ここで見てください非常に良いビデオです:Jason Dolinger on Model-View-ViewModel

MVVM (Model View View Model) Design Pattern for Winforms必要に応じてWPFに変換するのが簡単になる別のオプションがあります。 Magical.Trevorは、プロパティ名に基づいた自動バインディングも含まれている、WindowsフォームのMVVMのサンプルです。


また、あなたは、MVCを使用しているなぜ自問してみてください。

  • できるだけ多くのコードを単体テストできるようにしたいですか?
  • できるだけ多くのコードを再利用できるようにしようとしていますか?
  • コードベースを理解しやすくしていますか?
  • 他にも、特定のプロジェクトで有効な101の理由があります。

が明確になると、は1つの実装または別の実装を選択しやすくなります。

+0

この「CAB」とは何ですか? –

+0

@AgnelKurianのCABは、アプリケーションの構築方法に関するMicrosoftのサンプルコードのセットでした。これは現在ほとんどの歴史です。 –

+0

ハハ!はい、私はそれらの "アプリケーションブロック"を覚えています。 –

6

あなたはPureMVCを見ましたか?私は、MVCが特定の実装を構築し始めた後は、MVCの実際の外観に誰も同意できないことを発見しました。

更新:MobileMVCのような簡単なものから独自のものを作成することができます。コンパクトフレームワークのコードは、Windows上でOKをコンパイル/実行する必要があります。これは学校の割り当てなので、MVCが実際にどのように動作するかを実際に学習するには時間を費やすことをお勧めします。

+0

私は書店を管理する非常に単純なアプリケーションのための学校の割り当てを持っています.PureMVCのようなフレームワークの使用にはまったく嫌です。私はもっ​​と簡単なものを探しています。 – kjv

3

Differential Executionをご覧ください。

ここでは、それはまだ非常に珍しいですが、IMO、それは、MVC上の広大な改善であるSourceForge

です。

2

Windowsフォームを使用して独自のMVCを実装する良い例は、hereです。ソースコードが含まれています。

この課題を読んで、学習し、コードを書くときに、MVCの実装方法について多くの意見が分かれていることがわかります。これは、懸念の分離だけでなく、これを引き上げるために必要な「配管」の良い例を反映した単純なケースです。

あなたが学校にいるときは、おそらく他のポスターが推奨しているようなフレームワークに戻ってほしいでしょう。

2

Microsoft Composite Interfaceアプリケーションブロックは、実装された他のパターンの中でもMVC実装としての生活を開始しました。しかし、リリース版はMVP実装に発展しました。これは、MVCコンセプトの一種の解釈であると主張できます。

非常に完全なMVP実装のコードを確認したい場合は、Microsoft Smart Client Software Factoryのコンポーネントの1つとしてMS-CABを見つけることができます。ソースコードが付属しています。あなたはそれを見つけることができますhere。がんばろう!

43

UPDATE:以下の私の前の回答に加えて、私は"Presenter First" approach(特にPDF記事など)について読んで示唆

私の代わりにMVCのMVP(実際PassiveViewパターン)を推薦します。このために特別なフレームワークは本当に必要なく、コードをどのように整理するかだけです。 (私は通常取る)

一つのアプローチは、それぞれのウィンドウを分割することである3つのエンティティに形成:

  1. プレゼンター/コントローラクラスを - これはあなたが実際にフォームを開発する際に起動するものです。これはあなたの "ビジネス"ロジックの大部分/すべてが存在する場所です。
  2. メソッド、プロパティ、およびイベントを含むビューインタフェース(IView)。このインターフェイスは、すべてです。プレゼンターはあなたのフォームについて知っています。
  3. 最後に、プレゼンターとビュー(単体テストを含む)の実装が完了したら、実際のフォームクラスを作成してIViewインターフェイスを実装することができます。次に、フォームに適切なコントロールを追加してインターフェイスに配線するだけの問題です。

例コード(単にイラストのための簡単な擬似コード):

interface IView 
{ 
    string Username { get; set; } 
    string Password { get; set; } 

    event EventHandler LogOnButtonClicked; 

    void InformUserLogOnFailed(); 
    void MoveToMainScreen(); 
} 

class Presenter 
{ 
    public Presenter(IView view) 
    { 
     this.view = view; 
     view.LogOnButtonClicked += new EventHandler(OnLogOnButton); 
    } 

    private void OnLogOnButton() 
    { 
     // we ask some service to verify the username/password 
     bool isLogOnOk = logOnService.IsUserAndPasswordOk(view.Username, view.Password); 
     if (isLogOnOk) 
      view.MoveToMainScreen(); 
     else 
     { 
      view.Username = ""; 
      view.Password = ""; 
      view.InformUserLogOnFailed(); 
     } 
    } 

    private IView view; 
} 

class Form : IView 
{ 
    public Form() 
    { 
     presenter = new Presenter(this); 
    } 

    public string Username 
    { 
     get { return TextBoxUsername.Text; } 
     set { TextBoxUsername.Text = value; } 
    } 

    public string Password 
    { 
     get { return TextBoxPassword.Text; } 
     set { TextBoxPassword.Text = value; } 
    } 

    public void InformUserLogOnFailed() 
    { 
     MessageBox.Show("Invalid username or password."); 
    } 

    public void MoveToMainScreen() 
    { 
     // code for opening another form... 
    } 

    private Presenter presenter; 
} 
+7

これはPassiveViewと呼ばれるMVPバリアントの実装です。パッシブビューでは、ビューはプレゼンターの選択肢ではありません。 同様の例(ただし、REALYパッシブビューの場合)は、このサンプルをチェックしてくださいhttp://www.danieleteti.it/?p=221(Delphi言語の例) –

関連する問題