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に返値と同じ型のプロパティを用意します。全ての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ファイルに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用にいくつかのユーティリティクラスを用意しています。入力チェックなどに使ってみてください。
- Seasar.Windows.Util.Validator -- 入力チェック用ユーティリティクラス
.NET 1.1版用では次のクラスもあります。
- Seasar.Windows.Util.Converter -- 変換用ユーティリティクラス
|