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標記指定溫莎應該創建服務實例:
<%@ ServiceHost Language="C#"
Service="WcfService1.YourService"
CodeBehind="YourService.svc.cs"
Factory="Castle.Facilities.WcfIntegration.DefaultServiceHostFactory, Castle.Facilities.WcfIntegration"
%>
現在你可以有ILogger爲您服務的構造函數的參數。 Windsor將創建服務的每個實例併爲構造函數提供該參數。
我用它來創建每個WCF。
您的評論提到您使用Ninject。我發現this documentation顯示瞭如何連接Ninject和WCF。
它幾乎相同。對於服務的標記看起來是這樣的:
<%@ ServiceHost Language="C#"
Service="WcfService1.YourService"
CodeBehind="YourService.svc.cs"
Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory"
%>
然後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
。這似乎有點侵入性。
感謝您的建議。我會仔細看看它。雖然,我已經在使用Ninject IoC,但我不確定使用兩個不同的 –
您不能使用兩個,因爲無論創建您的服務是創建一切。 (我想你可以,但這將是一個併發症,沒有任何好處。)我沒有使用Ninject,但我看了文檔,配置幾乎相同。我喜歡偶爾使用不同的代碼,以確保我不會編寫依賴於特定代碼的代碼。容器應該是「隱形的」。 –