WindowsフォームにMVCパターンを完全に実装する方法の良い例はどこにありますか?
さまざまなサイト(たとえば、Code Projectや.NetHeavenなど)で多くのチュートリアルやコード例を見つけましたが、MVCよりも多くの方がオブザーバーパターンを代表しています。開発したいアプリケーションは学校のプロジェクト用なので、PureMVCやMVC#などのフレームワークを使用することに抵抗があります。
WindowsフォームにMVCパターンを完全に実装する方法の良い例はどこにありますか?
さまざまなサイト(たとえば、Code Projectや.NetHeavenなど)で多くのチュートリアルやコード例を見つけましたが、MVCよりも多くの方がオブザーバーパターンを代表しています。開発したいアプリケーションは学校のプロジェクト用なので、PureMVCやMVC#などのフレームワークを使用することに抵抗があります。
回答:
アプリケーションは互いに非常に異なっており、アプリケーションの記述方法についての私たちの理解は依然として非常に限られていると私は思います。これまでに取り組んだWindowsフォームアプリケーションは、非常に異なっていました。私が見たデザインの違いのいくつかは(ほとんどの組み合わせを含む)です:
したがって、常に適切に適合する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を使用する理由についても自問してください。
目的が明確になると、実装の選択が簡単になります。
更新:以下の私の以前の回答に加えて、私は「プレゼンターファースト」アプローチ(特にPDF記事)について読むことをお勧めします
MVCではなくMVP(実際にはPassiveViewパターン)をお勧めします。これには特別なフレームワークは必要ありません。それは、コードを編成する方法に過ぎません。
1つのアプローチ(私が通常使用する)は、各ウィンドウフォームを3つのエンティティに分割することです。
コード例(説明のための単純な疑似コード):
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;
}
PureMVCを見たことがありますか?特定の実装の構築を開始すると、MVCが実際にどのように見えるかに誰も同意できないことがわかりました。
更新:MobileMVCなど、もっと簡単なものから始めて、独自に作成することもできます。Compact Frameworkコードは、Windowsでコンパイル/実行できるはずです。これは学校の課題なので、MVCが実際にどのように機能するかを実際に学習することをお勧めします。
Microsoft Composite Interface Applicationブロックは、MVC実装として(他のパターンとともに)ライフサイクルを開始しました。ただし、リリースバージョンはMVP実装に進化しました。これは、MVCコンセプトの一種の異なる解釈であると主張できます。
非常に完全な(そしてどういうわけか複雑な)MVP実装のコードを確認したい場合は、MS-CABをMicrosoftスマートクライアントソフトウェアファクトリのコンポーネントの1つとして見つけることができます。ソースコードが付属しています。あなたはそれをここで見つけることができます。幸運を!