WindowsフォームでのMVCの実装


102

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

さまざまなサイト(たとえば、Code Projectや.NetHeavenなど)で多くのチュートリアルやコード例を見つけましたが、MVCよりも多くの方がオブザーバーパターンを代表しています。開発したいアプリケーションは学校のプロジェクト用なのでPureMVCMVC#などのフレームワークを使用することに抵抗があります。



回答:


115

アプリケーションは互いに非常に異なっており、アプリケーションの記述方法についての私たちの理解は依然として非常に限られていると私は思います。これまでに取り組んだWindowsフォームアプリケーションは、非常に異なっていました。私が見たデザインの違いのいくつかは(ほとんどの組み合わせを含む)です:

  • データベースと直接通信する(2層)
  • 特定のアプリケーション(3層)用に作成されたバックエンドを使用する
  • 多くのアプリケーションで使用するために作成され、アプリケーションで変更できないWebサービスのセットを使用します。(サービス指向アーキテクチャー)
  • CRUD操作によって行われる更新
  • コマンドパターンで行われる更新(バックエンドサーバーへのコマンドの送信)
  • データバインディングの多くの使用/ データバインディングの使用なし
  • ほとんどのデータは「テーブルのような」もの(請求書など)であり、標準のグリッドコントロールで適切に機能し、ほとんどのUIデータにカスタムコントロールが必要です。
  • 1人の開発者/ 10人または20人の開発者のチーム(UIのみ)
  • モックなどを使用した多数の単体テスト/単体テストなし

したがって、常に適切に適合するMVC(またはMVP)の実装を1つ作成することは不可能だと思います。

MVCの説明とMVCシステムがそのように構築されている理由を私が実際に見た中で最高の投稿は、Jeremy D Millerによる「Build Your Own CAB」シリーズです。それを働いた後、あなたはあなたのオプションをずっとよく理解することができるはずです。 Microsoftのスマートクライアントガイダンス(CAB / Microsoft Composite Application Block)も考慮する必要があります。これは少し複雑ですが、適切なアプリケーションに適しています。

WinformsプロジェクトのMVC / MVP実装を選択すると、読む価値のある概要が得られます。PureMVCを好む人はたくさんいます。私はそれを使用したことがありませんが、次回MVCフレームワークが必要になったときにそれを調べます。

Presenter First」は、Model View Presenter(MVP)の設計パターンとテスト駆動開発のアイデアを組み合わせたソフトウェア開発アプローチです。顧客の言語でテストを作成することから始めます。例えば:

「[保存]ボタンをクリックすると、ファイルが保存され、保存されていないファイルの警告が消えます。」

「Presenter First」の使用経験はありませんが、有望そうなので機会があればやってみます。

あなたが見てみたいかもしれない他のスタックオーバーフローの質問はここここにあります

任意の時点でWPFの使用を検討している場合は、Model-View ViewModel(MVVM)パターンを確認してください。これは、見ておくべき非常に優れたビデオです。Model-View-ViewModelのJason Dolingerです。

WinformsのMVVM(モデルビュービューモデル)デザインパターンは、必要に応じてWPFへの変換を容易にする別のオプションを提供します。 Magical.Trevorは、プロパティ名に基づく自動バインディングも含むWindowsフォーム用のMVVMサンプルです。


また、MVCを使用する理由についても自問してください。

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

目的が明確になると、実装の選択が簡単になります。


@ AgnelKurian、CABは、アプリの構築方法に関するMicrosoftのサンプルコードのセットでした。現在はほとんどが履歴です。
Ian Ringrose 2013年

ははは!はい、その「アプリケーションブロック」を覚えています。
Agnel Kurian 2013年

45

更新:以下の私の以前の回答に加えて、私は「プレゼンターファースト」アプローチ(特にPDF記事)について読むことをお勧めします

MVCではなくMVP(実際にはPassiveViewパターン)をお勧めします。これには特別なフレームワークは必要ありません。それは、コードを編成する方法に過ぎません。

1つのアプローチ(私が通常使用する)は、各ウィンドウフォームを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パッシブです)については、このサンプルdanieleteti.it/?p=221(Delphi言語の例)を確認してください
Daniele Teti

6

PureMVCを見たことがありますか?特定の実装の構築を開始すると、MVCが実際にどのように見えるかに誰も同意できないことがわかりました。

更新:MobileMVCなど、もっと簡単なものから始めて、独自に作成することもできます。Compact Frameworkコードは、Windowsでコンパイル/実行できるはずです。これは学校の課題なので、MVCが実際にどのように機能するかを実際に学習することをお勧めします。


書店を管理するための非常に単純なアプリケーションの学校の割り当てがあり、PureMVCのようなフレームワークを使用することに非常に消極的です。もっと簡単なものを探しています。
kjv


2

Windowsフォームを使用してMVCの独自の実装をローリングする良い例は、こちらにあります。ソースコードが含まれています。

この課題のコードを読み、研究し、書くと、MVCの実装方法について多くの意見の相違があることがわかります。これは、懸念の分離を反映する単純なケースであり、これを接続するために必要な「配管」の良い例です。

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


2

Microsoft Composite Interface Applicationブロックは、MVC実装として(他のパターンとともに)ライフサイクルを開始しました。ただし、リリースバージョンはMVP実装に進化しました。これは、MVCコンセプトの一種の異なる解釈であると主張できます。

非常に完全な(そしてどういうわけか複雑な)MVP実装のコードを確認したい場合は、MS-CABをMicrosoftスマートクライアントソフトウェアファクトリのコンポーネントの1つとして見つけることができます。ソースコードが付属しています。あなたはそれをここで見つけることができます。幸運を!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.