S2WindowSampleと言う名前でWindowsアプリのプロジェクトを作る。
Form1は,とりあえず削除!!
Seasar.NETを使えるようになるまでに
参照設定にlog4netとSeasar,Seasar.Windowsを追加する。
App.configも追加
ここからはlog4netを使うためのおまじない
AssemblyInfo.csに[assembly: log4net.Config.XmlConfigurator(Watch=true)]を追加する。
ここらへんはドキュメント通り。コピペで済ませよう。
App.config
<configuration> <configSections> <section name="log4net" type="System.Configuration.IgnoreSectionHandler" /> <section name="seasar" type="Seasar.Framework.Xml.S2SectionHandler, Seasar" /> </configSections> <log4net> <appender name="TraceAppender" type="log4net.Appender.TraceAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%-5p %d [%t] %m%n" /> </layout> </appender> <root> <level value="DEBUG" /> <appender-ref ref="TraceAppender" /> </root> </log4net> <seasar> </seasar> </configuration>
log4netの設定読み込みもMainの先頭に書いてしまおう
System.IO.FileInfo info = new System.IO.FileInfo( log4net.Util.SystemInfo.AssemblyShortName( System.Reflection.Assembly.GetExecutingAssembly()) + ".exe.config"); // アセンブリがdllの場合は".dll.config" log4net.Config.XmlConfigurator.Configure( log4net.LogManager.GetRepository(), info);
S2Unit.NETや,Seasar.DynamicProxyは今回は使わないので基本設定は終り!
最後に,Seasar.Windows.dllの中身もdiconファイルで使う予定なのでApp.configを下のようにしておく
<configuration> <configSections> <section name="log4net" type="System.Configuration.IgnoreSectionHandler" /> <section name="seasar" type="Seasar.Framework.Xml.S2SectionHandler, Seasar" /> </configSections> <log4net> <appender name="TraceAppender" type="log4net.Appender.TraceAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%-5p %d [%t] %m%n" /> </layout> </appender> <root> <level value="DEBUG" /> <appender-ref ref="TraceAppender" /> </root> </log4net> <seasar> <configPath>S2WindowsSample.App.dicon</configPath> <assemblys> <assembly>Seasar.Windows</assembly> </assemblys> </seasar> </configuration>
seasarの中にちょびっと追加。
ここらへんはSeasar.NET使ったことあるなら大丈夫なんだろう。
俺はほとんど使ってないから毎回コピペですorz
App.diconファイルも用意して準備完了!
やっとS2Windows・・・
なんだか疲れた。
この一連の作業って地味にめんどくさいですね。
ウィザードとかがそのうち出来る事を祈っておこうかな。
メインウィンドウを出してみよう
ということでメインウィンドウを出します!!
フォームを1つMainFormという名前で追加します。
追加したら,App.diconを*1下のようにする。
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components21.dtd"> <components> <component class="Seasar.Windows.S2ApplicationContext"> <property name="DIContainer">container</property> <property name="MainForm">MainForm</property> </component> <component name="MainForm" class="S2WindowsSample.MainForm" /> </components>
ついでにMainも!
さっきのlog4netのコードも入ってこんな感じ。
using System; using System.Collections.Generic; using System.Windows.Forms; using Seasar.Framework.Container.Factory; using Seasar.Framework.Container; namespace S2WindowsSample { static class Program { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { System.IO.FileInfo info = new System.IO.FileInfo( log4net.Util.SystemInfo.AssemblyShortName( System.Reflection.Assembly.GetExecutingAssembly()) + ".exe.config"); log4net.Config.XmlConfigurator.Configure( log4net.LogManager.GetRepository(), info); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); SingletonS2ContainerFactory.Init(); try { IS2Container con = SingletonS2ContainerFactory.Container; ApplicationContext ctx = (ApplicationContext)con.GetComponent(typeof(ApplicationContext)); Application.Run(ctx); } finally { SingletonS2ContainerFactory.Destroy(); } } } }
これで実行するとウィンドウが出ます。*2
Mainの中の書き方は,どこにも見当たらなかったけどこれで動いてるからよしとしよう。
次は,ボタンを押したらウィンドウが表示されるようにしましょう。
Dispacherというフォルダをプロジェクト内に作って,そこにIFormDispacherというインターフェイスを追加します。
ここでは,Showなにがしという名前のメソッドをフォームを表示するときのメソッドとして使います。
ということで,App.diconにIFormDispacherを登録しませふ。
IFormDispacherにはFormInterceptorをアスペクトに指定します。
これでApp.diconはこんな感じになりました。
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components21.dtd"> <components> <component class="Seasar.Windows.S2ApplicationContext"> <property name="DIContainer">container</property> <property name="MainForm">MainForm</property> </component> <component class="S2WindowsSample.Dispacher.IFormDispacher"> <aspect pointcut="^Show.*$"> <component class="Seasar.Windows.AOP.Interceptors.FormInterceptor" /> </aspect> </component> <component name="MainForm" class="S2WindowsSample.MainForm" /> </components>
下地は出来た!(はず)
Formをもう1個作ろう。
HelloFormという名前のフォームを作って,App.diconに登録する。
HelloFormはボタンが押される度に何個も出てきて欲しいのでprototypeにしておきます。
そして,IFormDispacherにメソッド追加。
TargetForm属性で,どのフォームをどういう風に表示するかきめるみたい。
メソッド名はdiconファイルに登録した正規表現にマッチするように注意だ!
==IFormDispacher.cs------------------------ using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using Seasar.Windows.Attr; namespace S2WindowsSample.Dispacher { public interface IFormDispacher { [TargetForm(typeof(HelloForm), ModalType.Modaless)] void ShowHelloForm(); } }
MainFormにIFormDispacher型のプロパティを追加します。
Dispacherって名前でいいかな。
追加したらボタンを1つ置いてクリックイベントハンドラで下のように書きます。
==MainForm.cs------------------------------------ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using S2WindowsSample.Dispacher; namespace S2WindowsSample { public partial class MainForm : Form { private IFormDispacher dispacher; public IFormDispacher Dispacher { get { return dispacher; } set { dispacher = value; } } public MainForm() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.Dispacher.ShowHelloForm(); } } }
これで実行してみると…。
ボタンを押すとフォームがでます!調子にのって押しまくるといっぱいになります。
パラメータを渡す
最後に,HelloFormにパラメータを渡す方法をやります。
HelloFormにラベルを1つ追加します。
HelloFormにMessageというプロパティを用意してsetに先程のラベルのテキストにvalueを設定するように書きませふ。
IFormDispacherのShowHelloFormに引数を1つ追加します。
引数名と型は,先程ついかしたMessageプロパティの名前とあわせます。
こんな感じです
==IFormDispacher.cs---------------------------------- using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; using Seasar.Windows.Attr; namespace S2WindowsSample.Dispacher { public interface IFormDispacher { [TargetForm(typeof(HelloForm), ModalType.Modaless)] void ShowHelloForm(string Message); } }
MainFormでコンパイルエラーが出るようになるので,引数に適当な値を渡してやるように変更しませふ。
後は,コンパイル実行!!!
ボタンを押すと,メッセージが設定されたフォームがポコポコ出てきます。
値をちゃんと渡せてそうです。
DTOとか渡すようになるのかな?
さて,ちなみに今のIFormDispacherのメソッドの戻り値はvoidですが,DialogResultにすることも出来ます。
ただし,モーダレスの場合は,常にNoが返るはず。
モーダルのときだけ使えますな。
ここらへんこの先どうなるか楽しみです。