Seasar DI Container with AOP
S2Container.NET TOPページへ

WindowsFormの画面遷移をコントロールする

S2Windows.NETを使ったWindowsFormの画面遷移の制御について説明します。

一般に、WindowsFormの画面遷移を制御するには、それぞれのWindowsFormのメソッドの中で呼び出すWindowsFormの オブジェクトを生成し、表示してきました。

そこを、WindowsFormや画面遷移をDIするためには次のようにします。

S2Windows.NETを使用するときには、アプリケーション構成ファイルの<assemblys>にアセンブリ(Seasar.Windows)を指定します。

画面遷移用インターフェイスを用意する

実行用ファイルを作成するプロジェクトにインターフェイスを追加します。

そして、WindowsFormを呼び出すメソッドを追加します。このメソッドを取り決めた命名規則に従って命名しておくと、 下記のdiconファイルを設定するときに楽になります。

Seasar.Windows.Attr.TargetForm属性を使ってメソッドに表示するフォームを設定します。

IDは引数の例で、フォームのIDプロパティに引数の値がセットされます。つまり、引数と同名のプロパティをフォームに用意していると引数の値をセットします。この引数名とプロパティ名は大文字小文字まで完全に一致する必要があります。

C#
public interface IFormDispatcher
{
    [TargetForm(typeof ( FrmHoge ), ModalType.Modal)]
    void ShowHoge(int ID);

    [TargetForm(typeof ( FrmHoge2 ), ModalType.Modal, "ReturnValue")]
    HogeDto ShowHoge2(int ID);
}
VB.NET
Public Interface IFormDispatcher
    <TargetForm(GetType(FrmHoge), ModalType.Modal)> Sub ShowHoge(ByVal ID As Integer)

    <TargetForm(GetType(FrmHoge2), ModalType.Modal, "ReturnValue")> Function ShowHoge2(ByVal ID As Integer) As HogeDto
End Interface

一番目のメソッドの例でのTargetForm属性の最初の引数は、遷移先WindowsFormのtypeを指定します。二番目の引数はWindowsFormのモーダルタイプを指定します。こちらでメソッドの返値を指定するには、diconファイルで遷移先対象WindowsFormからの返値を取得するためのプロパティ名を指定します。

二番目のメソッドの例でのTargetForm属性の最初の引数は遷移先WindowsFormのtypeを指定します。二番目の引数はWindowsFormのモーダルタイプを指定します。三番目の引数は遷移先対象WindowsFormからの返値を取得するためのプロパティ名です。

WindowsFormにプロパティを用意する

画面遷移用インターフェイスに作成したメソッドに引数がある場合、遷移先WindowsFormに引数と同名のプロパティを用意します。型も一致させます。画面遷移時に、このプロパティに引数の値をセットすることになります。

画面遷移用インターフェイスに作成したメソッドに返値がある場合、遷移先WindowsFormに返値と同じ型のプロパティを用意します。全てのFormで同じプロパティ名であれば、Diconファイルで指定し、Formごとに異なる場合はTargetForm属性で指定します。

起動用クラスを用意する

実行ファイルのプロジェクトにアプリケーション起動用クラスを用意します。通常、プロジェクトの生成時に作られる最初のフォームからMain文を 移してくればいいでしょう。もちろん、プロジェクトのスタートアップオブジェクトもこの起動用クラスに変更します。

C#
public class StartMain
{
    /// <summary>
    /// DIコンテナ設定ファイル
    /// </summary>
    private const string PATH = "Examples.dicon";

    /// <summary>
    /// コンストラクタ
    /// </summary>
    public StartMain()
    {
        ;
    }

    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    private static void Main()
    {
        Application.EnableVisualStyles();

        IS2Container container = S2ContainerFactory.Create(PATH);
        container.Init();

        ApplicationContext context
             = (ApplicationContext) container.GetComponent(typeof ( S2ApplicationContext ));
        Application.Run(context);
    }
}

diconファイルの修正

diconファイルにWindowsForm、ApplicationContextの設定、AOPによる画面遷移コントロールを設定します。

WindowsFormの設定は次のように行います。

    <component name="frmHoge" class="Seasar.Windows.Examples.FrmHoge" />

WindowsFormをModalessで表示するときには、該当するWindowsFormのinstance属性にはprototypeを指定します。そうしないと、 WindowsFormを閉じて、再度表示されなくなります。

起動用クラスで使うApplicationContextの設定は次のように行います。

    <component name="AppContext" class="Seasar.Windows.S2ApplicationContext" >
       <arg>container</arg>
       <!-- MainFormを初期起動フォームに変更する -->
       <property name="MainForm">frmHoge</property>
    </component>

AOPによる画面遷移の設定は次のように行います。画面遷移用インターフェイスのメソッドに対し、Seasar.Windows.AOP.Interceptors.FormInterceptorでpointcutを設定します。

    <component name="Dispatcher" class="Seasar.Windows.Examples.IFormDispatcher">
        <!-- pointcutは命名規則に従ってつけたメソッド名を正規表現で表示する -->
        <aspect pointcut="Show.*">
            <component class="Seasar.Windows.AOP.Interceptors.FormInterceptor" >
              <!-- プロパティPropertyはFormからの返値用プロパティを指定する -->
              <property name ="Property">"ReturnValue"</property>
            </component>
        </aspect>
    </component>

上記のWindowsFormを設定したdiconファイルとDao等を設定したS2Unit.NETで使うdiconファイルで分けておいた方が、S2Unit.NETを使用する場合、テストに不要なWindowsFormのオブジェクトをS2Container.NETが生成しないで済みます。

WindowsForm用ユーティリティクラス

WindowsForm用にいくつかのユーティリティクラスを用意しています。入力チェックなどに使ってみてください。

  • Seasar.Windows.Util.Validator      -- 入力チェック用ユーティリティクラス
.NET 1.1版用では次のクラスもあります。
  • Seasar.Windows.Util.Converter      -- 変換用ユーティリティクラス