– 件名:PACパターンにおいて、Formクラスはコントロール層なのか?
自動生成の Form だと、MVC の V+C な動作をしていますね。
結論としては、ここの流れどおり、コントローラを別に作って、そっちをエントリポイントにするのがベターじゃないかなと思います。
2006-02-08 追記:
よく使われる Application.Run(Form) だと、せっかく Main() メソッドを分離してもイベントハンドラの段階で V+C な形になってしまうので、ApplicationContext インターフェイスを実装してこれを Application.Run(ApplicationContext) に渡してやると、コントローラとビューの分離がよりスマートにできる。
2007-04-10 追記:
ApplicationContext を利用した場合の実装例はこんな感じになります。
using System;
using System.Windows.Forms;
class Controller : ApplicationContext{
// MVC の view レイヤ( Controller との接合部のみを IView として interface にしてもよい)
private Form1 view;
// コンストラクタ
internal Controller(){
view = new Form1();// フォームが閉じられた時にアプリケーションを終了させるためのイベントハンドラを追加。
view.Dispose += new EventHandler( delegate (object sender, EventArgs e){
Dispose();
Application.Exit();
});
// フォームを表示
view.Show();
}
}
あとはこれを Program.cs などエントリポイント( static void Main(string[]) 関数)の
Application.Run(new Form1);
などとなっている箇所を
Application.Run(new Controller());
のようにすれば、直接 Form を呼び出す実装ではなく ApplicationContext を介した実装になります。
参考:
– .NET TIPS – VB.NETでアプリケーション起動時に実行されるフォームを変更するには?(@IT)
VS.NET でのエントリポイントの設定の仕方について書かれています。
– Application.Runメソッド(ApplicationContext) (MSDN -> .NET Framework-> リファレンス -> クラスライブラリ -> System.Windows.Forms -> Application クラス -> メソッド -> Run メソッド)
リンク先のサンプルの動作には次の宣言が必要。また、MyForm1, MyForm2 というフォームクラスを用意する必要がある。
using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
using System.ComponentModel;
using System.Text;