2016-03-03 7 views
0

Я только что прочитал this отличный ответ, как добавить зависимости в службу WCF. Решение довольно аккуратное, но у меня проблема.Включение зависимостей в IErrorHandler во время хостинга в IIS

Решение в этом ответе использует само-хостинг (консольное приложение), так что можно реализовать собственные ServiceHost и ErrorHandler и сделать:

var logger = new DummyLogger(); 
var errorHandler = new TestErrorHandler(logger); 

ServiceHost host = new TestServiceHost(errorHandler, typeof(TestService), new Uri("net.tcp://localhost:8002")); 
host.Open(); 

Моя проблема в том, , как я могу это сделать в ASP.NET Хост веб-приложения? Я пытаюсь внедрить что-то в Сервис во время хостинга через IIS. Любая помощь будет замечательной!

ответ

1

Замок Виндзор 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. Это кажется немного интрузивным.

+0

спасибо за это предложение. Я присмотрюсь к нему. Хотя, я уже использую Ninject IoC, и я не уверен, что хорошо использовать два разных файла. –

+0

Вы не можете использовать два, потому что все, что создает ваш сервис, будет создавать все. (Я полагаю, вы могли бы, но это было бы осложнением без каких-либо преимуществ.) Я не использовал Ninject, но я просмотрел документы, и конфигурация практически такая же. Мне нравится каждый раз использовать разные, чтобы убедиться, что я не пишу код, который зависит от конкретного. Контейнер должен быть «невидимым». –

Смежные вопросы