SeasarプロジェクトSeasar.NETプロジェクトS2Container.NETS2Windows.NET > 画面遷移をコントロール

目次


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

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

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

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

 S2Windows.NETはSeasar.Quill.NETを必要とするようになりました(1.3.8より)。

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

 そして、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

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に返値と同じ型のプロパティを用意します。 全ての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 ));
        if (context.MainForm == null)
            context.MainForm = (Form) container.GetComponent("MainForm");
        Application.Run(context);
    }
}

 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>

 WindowsFormをS2Containerに自動登録したときには、IAutoNamingインターフェイスの実装クラスであるSeasar.Windows.DefaultFormNamingクラスを利用します。このクラスはMainFormNameプロパティで指定したWindowsFormクラスをLabelプロパティ名でs2containerにコンポーネントの自動登録時に登録します。

 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が生成しないで済みます。

 Quillを使ってWindowsFormの画面遷移の制御を行う場合、上で説明したFormInterceptorに代わり、 Seasar.Windows.AOP.Interceptors.QuillFormInterceptorを利用します。

 この場合、「画面遷移用インターフェイスを用意する」にあるように作成する代わりに、次のようにQuillのAOP指定をします

[Implementation]
[Aspect(typeof(Seasar.Windows.AOP.Interceptors.QuillFormInterceptor))]
public interface IFormDispatcher
{
    [TargetForm(typeof ( FrmHoge ), ModalType.Modal)]
    void ShowHoge(int id);

    [TargetForm(typeof ( FrmHoge2 ), ModalType.Modal, "ReturnValue")]
    HogeDto ShowHoge2(int id);
}

VB

<Implementation> _
<Aspect(GetType(Seasar.Windows.AOP.Interceptors.QuillFormInterceptor))> _
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

そして「WindowsFormにプロパティを用意する」にあるとおりプロパティを用意します。

「起動用クラスを用意する」「diconファイルの修正」にあるようなことは不要です。 ただし、Quillの「Windowsアプリケーションから簡単にQuillを利用する」にあるような設定を行う必要があります。

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

  • Seasar.Windows.Util.Validator      -- 入力チェック用ユーティリティクラス

 .NET 1.1版用では次のクラスもあります。

  • Seasar.Windows.Util.Converter      -- 変換用ユーティリティクラス