Как внедрить реализацию службы WCF в другую службу WCF с помощью Autofac - PullRequest
4 голосов
/ 16 июня 2019

У меня есть несколько служб WCF, размещенных в IIS и настроенных с помощью Autofac.

Global.asax

var builder = new ContainerBuilder();

builder.RegisterType<ServiceA>();
builder.RegisterType<ServiceB>();
builder.RegisterType<ServiceC>();

var container = builder.Build();
AutofacHostFactory.Container = container;

web.config

<system.serviceModel>
  ...
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">
    <serviceActivations>
      <add service="ServiceA, MyServicesAssembly" relativeAddress="./ServiceA.svc" factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" />
      <add service="ServiceB, MyServicesAssembly" relativeAddress="./ServiceB.svc" factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" />
      <add service="ServiceC, MyServicesAssembly" relativeAddress="./ServiceC.svc" factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf" />
    </serviceActivations>
  </serviceHostingEnvironment>
<system.serviceModel>

Реализации службы

public class ServiceA : IServiceA 
{
    public ServiceA()
    {            
    }
}

public class ServiceB : IServiceB
{
    public ServiceB()
    {            
    }
}

public class ServiceC : IServiceC
{
    public ServiceC(IServiceA serviceA)
    {            
    }
}

Как видите, ServiceC отличается от других и нуждается в реализации IServiceA.Autofac не может решить эту проблему, потому что для IServiceA нет регистрации.

Поэтому я изменяю регистрацию на это:

builder.RegisterType<ServiceA>().As<IServiceA>();

Autofac теперь может успешно разрешать ServiceC, но хостинг WCFбольше не работает:

Исключение типа 'System.ServiceModel.ServiceActivationException' произошло в mscorlib.dll, но не было обработано в коде пользователя

Так что мойвопрос:

Есть ли способ, которым я могу иметь как размещенный экземпляр службы WCF, так и возможность передать реализацию службы в другую службу?Все настроено с помощью AutoFac?Я также думаю об обходном пути, но все, что приходит мне в голову, приводит к огромным усилиям.Я знаю, что эти сервисы необходимо реорганизовать, чтобы не было необходимости переходить в другой «сервис».Но это другая история.

1 Ответ

3 голосов
/ 16 июня 2019

Если вы хотите представить компонент как набор услуг, а также используя службу по умолчанию, используйте метод AsSelf:

//...

builder.RegisterType<ServiceA>()
    .AsSelf() //<--
    .As<IServiceA>();

//...

Это свяжет класс и интерфейс вместе, так что IServiceA может быть введен по мере необходимости, и он будет преобразован в ServiceA. Это также позволяет WCF не ломаться, поскольку ServiceA зарегистрировано.

Ссылка Документация Autofac: концепции регистрации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...