Castle Windsor 的WCF 集成设施就是这样做的。
将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
. 这似乎有点侵入性。