WCFでSeasar.NETを使う

今開発中のパッケージはWebサービスを使っていますが、ユーザの環境がイントラネットオンリーだと分かっている場合は、Webサービスのオーバーヘッドが勿体ないのでTCP/IPとかに出来ればなぁ、とか思っていたら、IIS7ではWindowsプロセスアクティブ化サービス(WAS)が追加され、これだとIISでもTCPやNamed-Pipe、MSMQなどが使えることが分かって、ちょっとWCFに興味が出てきました。早速、WCFIISでホストさせてみたところ、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については、まだまだ調査不足でコレで良いのか自信がありませんが、一応、参考までに。