如何使用Autofac将WCF服务实现注入到另一个WCF服务中

时间:2019-06-15 22:29:31

标签: c# wcf dependency-injection autofac

我有多个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托管不再起作用:

  

mscorlib.dll中发生类型'System.ServiceModel.ServiceActivationException'的异常,但未在用户代码中处理

所以我的问题是:

是否可以同时拥有一个托管的WCF服务实例,并且可以将服务实现传递给另一个服务?全部配置了AutoFac? 我也在考虑一种解决方法,但是我想到的一切都会导致巨大的努力。 我知道这些服务需要重构,因此不需要传递另一个“服务”。但这是一个不同的故事。

1 个答案:

答案 0 :(得分:3)

  

如果要将组件公开为一组服务以及   使用默认服务,请使用AsSelf方法:

//...

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

//...

这会将类和接口关联在一起,以便可以根据需要注入IServiceA并将其解析为ServiceA。这也使WCF在注册ServiceA时不会中断。

引用Autofac Documentation: Registration Concepts