Замок Виндзор 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 эквивалент установщиком Windsor:
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, но я просмотрел документы, и конфигурация практически такая же. Мне нравится каждый раз использовать разные, чтобы убедиться, что я не пишу код, который зависит от конкретного. Контейнер должен быть «невидимым». –