Castle Windsor のWCF Integration Facilityがこれを行います。
nugetパッケージを WCF プロジェクトに追加します。アプリケーションの起動時 (global.asax または作成したブートストラップ クラス):
using System;
using Castle.Facilities.WcfIntegration;
using Castle.Windsor;
using Castle.Windsor.Installer;
namespace WcfService1
{
public class Global : System.Web.HttpApplication
{
static readonly IWindsorContainer Container = new WindsorContainer();
protected void Application_Start(object sender, EventArgs e)
{
ConfigureContainer();
}
private void ConfigureContainer()
{
Container.AddFacility<WcfFacility>();
Container.Install(FromAssembly.This());
}
}
}
次に、インストーラー クラスを追加します。Container.Install(FromAssembly.This())
サービス内のインストーラーを実行します。
using Castle.Core.Logging;
using Castle.MicroKernel.Registration;
using Castle.MicroKernel.SubSystems.Configuration;
using Castle.Windsor;
namespace WcfService1
{
public class WindsorInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Component.For<IYourService,YourService>(),
Component.For<ILogger,DummyLogger>()
);
}
}
}
最後に、YourService.svc のマークアップを編集して、Windsor がサービス インスタンスを作成するように指定します。
<%@ ServiceHost Language="C#"
Service="WcfService1.YourService"
CodeBehind="YourService.svc.cs"
Factory="Castle.Facilities.WcfIntegration.DefaultServiceHostFactory, Castle.Facilities.WcfIntegration"
%>
これで、サービスのコンストラクターで ILogger を引数として使用できるようになりました。Windsor は、サービスの各インスタンスを作成し、コンストラクターにその引数を提供します。
私が作成するほぼすべての WCF でこれを使用します。
あなたのコメントは、あなたがNinjectを使用していると述べました。Ninject と WCF を接続する方法を示すこのドキュメントを見つけました。
ほぼ同じです。サービスのマークアップは次のようになります。
<%@ ServiceHost Language="C#"
Service="WcfService1.YourService"
CodeBehind="YourService.svc.cs"
Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory"
%>
次に、Windsor インストーラーに相当する Ninject:
public class WCFNinjectModule : NinjectModule
{
public override void Load()
{
Bind<ILogger>().To<DummyLogger>();
}
}
次にglobal.asax
public class Global : NinjectWcfApplication
protected override IKernel CreateKernel()
{
return new StandardKernel(new WCFNinjectModule());
}
オフに見える唯一のことは、から継承する必要があることですNinjectWcfApplication
。でglobal.asax
。それは少し邪魔に思えます。