WCFでSeasar.NETを使う
今開発中のパッケージはWebサービスを使っていますが、ユーザの環境がイントラネットオンリーだと分かっている場合は、Webサービスのオーバーヘッドが勿体ないのでTCP/IPとかに出来ればなぁ、とか思っていたら、IIS7ではWindowsプロセスアクティブ化サービス(WAS)が追加され、これだとIISでもTCPやNamed-Pipe、MSMQなどが使えることが分かって、ちょっとWCFに興味が出てきました。早速、WCFをIISでホストさせてみたところ、ASP.NETと違ってGlobal.aspx相当のものが存在せず、DIコンテナの初期化タイミングをどうしようか悩みました。
調べてみたところServiceHostFactoryに手を入れれば良さそうなので、以下のようにしてみました。
using System; using System.ServiceModel; using System.ServiceModel.Activation; using Seasar.Framework.Container.Factory; namespace IISHostDI { public class MyServiceHostFactory : ServiceHostFactoryBase { public override ServiceHostBase CreateServiceHost( string constructorString, Uri[] baseAddresses) { Type service = Type.GetType(constructorString); ServiceHost host = new ServiceHost(service, baseAddresses); // hook up event handlers host.Opening += Opening; host.Closing += Closing; return host; } private static void Opening(object sender, EventArgs e) { SingletonS2ContainerFactory.Init(); } private static void Closing(object sender, EventArgs e) { SingletonS2ContainerFactory.Destroy(); } } }
あとは、Service.svcファイルに
<%@ ServiceHost Service="IISHostDI.Service1" Factory="IISHostDI.MyServiceHostFactory" %>
と書いてやれば、自作したMyServiceHostFactoryが呼ばれ、DIコンテナの初期化が走ります。WCFについては、まだまだ調査不足でコレで良いのか自信がありませんが、一応、参考までに。