0

Я создаю службу WCF, размещенную на службе Windows, как описано здесь: https://msdn.microsoft.com/en-us/library/ms733069(v=vs.110).aspx.Инъекция зависимостей (с использованием простой инжектора) в службе WCF, размещенной в управляемой службе Windows.

У меня есть некоторые зависимости.

Какой бы правильный способ применить DI здесь, используя простой Inyector.

Я читал о классе SimpleInjectorServiceHostFactory здесь https://simpleinjector.readthedocs.org/en/latest/wcfintegration.html, но, похоже, он работает только для хостинговых служб IIS.

На первом примере я предполагаю, что я регистрирую типы по методу Main(), но как мне создать ServiceBase?

И что более важно, как я могу вызвать (или создать) экземпляр servicehost. Должен ли я получить контейнер откуда-то и напрямую создать экземпляр реального сервиса, используя его. Это кажется довольно уродливый для меня

protected override void OnStart(string[] args) 
{ 
    if (serviceHost != null) 
    { 
     serviceHost.Close(); 
    } 

    // Create a ServiceHost for the CalculatorService type using the 
    // container directly 
    serviceHost = serviceHost = new ServiceHost(container.GetInstance<ICalculatorService>()); 

    serviceHost.Open(); 
} 
+1

Я предлагаю вам взглянуть на книгу [Инъекция зависимостей в .NET] (https://www.manning.com/books/dependency-injection-in-dot-net). В разделе 7.3 подробно описано, как настроить WCF для DI (это не то, что я сделал, поэтому я просто оставляю комментарий). Мне полезно создавать свои собственные интеграционные компоненты DI, потому что часто (как и в вашем случае) акции сторонних сторон не подходят для использования вашего приложения, и книга рассказывает вам, как построить такую ​​интеграцию с WCF. – NightOwl888

+1

Я согласен с NightOwl. У меня никогда не было проблем с WCF, потому что я использую классы обслуживания WCF как смиренные объекты и рассматриваю их как часть моего корня композиции. Это означает, что мои службы WCF не содержат логики приложения и просто разрешают службу из контейнера, который содержит логику. – Steven

+1

[этот пост] (https://cuttingedge.it/blogs/steven/pivot/entry.php?id=95) может быть вам полезен ... – qujck

ответ

0

Этот блог обеспечивает возможный подход: Decouple WCF Services from their DI Container with Common Instance Factory

Соответствующий код для создания ServiceHost экземпляра:

ServiceHost serviceHost; 
var serviceBaseAddress = new Uri('http://localhost:8000/GreetingService'); 
switch (containerType) 
{ 
    case ContainerType.Ninject: 
     serviceHost = new NinjectServiceHost<GreetingService> 
      (CreateNinjectContainer(), typeof(GreetingService), serviceBaseAddress); 
     break; 
    case ContainerType.SimpleInjector: 
     serviceHost = new SimpleInjectorServiceHost<GreetingService> 
      (CreateSimpleInjectorContainer(), typeof(GreetingService), serviceBaseAddress); 
     break; 
} 
Смежные вопросы