これまでは、.NET Frameworkアプリケーションで、明示的にS2Containerを作成していましたが、 Webアプリケーションの場合、誰がS2Containerを作成するのでしょうか。その目的のために次のクラスが用意されています。
- Seasar.Framework.Container.Web.S2HttpModule
S2HttpModuleを使うためにはWeb.configに次の項目を記述し、ASP.NETアプリケーションにS2HttpModuleを追加します。 source/Seasar/Seasar.Framework.Container/Web/Web.configに記述例もあります。
<httpModules> <add name="S2HttpModule" type="Seasar.Framework.Container.Web.S2HttpModule, Seasar" /> </httpModules>
アプリケーション構成ファイル に定義するseasarセクションのconfigPath要素でメインとなるS2Container定義のパスを指定します。S2HttpModuleが起動した後は、 次のメソッドでS2Containerのインスタンスを取得することができます。
- Seasar.Framework.Container.Factory.SingletonS2ContainerFactory#GetContainer()
S2HttpModuleを使っている場合、HttpApplicationをhttpApplicationという名前のコンポーネントとして アクセスできるようになります。
Global.asaxのApplication_StartメソッドでS2Containerの初期化、 Application_EndメソッドでS2Containerの破棄を行うように編集します。 SingletonS2ContainerFactoryクラスはSeasar.Framework.Container.Factory名前空間に存在します。
C#
protected void Application_Start(Object sender, EventArgs e) { SingletonS2ContainerFactory.Init(); } protected void Application_End(Object sender, EventArgs e) { SingletonS2ContainerFactory.Destroy(); }
VB
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) SingletonS2ContainerFactory.Init() End Sub Sub Application_End(ByVal sender As Object, ByVal e As EventArgs) SingletonS2ContainerFactory.Destroy(); End Sub
ASP.NETのWebフォームをS2Containerに登録すると、Webフォームに対してDependency Injection を行うことができます。Webフォームの登録は以下のように設定します。
<component name="/Path/WebForm1.aspx" instance="outer" />
name属性にはWebフォームへの要求の仮想パスを指定します。 instance属性にはouterを指定します。(S2ContainerでWebフォームのインスタンスを管理しないためです。)
コンポーネントに対して、HttpRequestをバインディングすることが出来ます。 HttpRequest、HttpResponse、HttpSessionState、HttpApplicationは、それぞれrequest、 response、session、httpApplicationという名前のコンポーネントとして登録されています。 プロパティ・バインディングやコンストラクタ・バインディングで使ってください。自動バインディングは行われません。 また、S2HttpModuleをWeb.configに定義する必要があります。