我有多个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? 我也在考虑一种解决方法,但是我想到的一切都会导致巨大的努力。 我知道这些服务需要重构,因此不需要传递另一个“服务”。但这是一个不同的故事。
答案 0 :(得分:3)
如果要将组件公开为一组服务以及 使用默认服务,请使用
AsSelf
方法:
//...
builder.RegisterType<ServiceA>()
.AsSelf() //<--
.As<IServiceA>();
//...
这会将类和接口关联在一起,以便可以根据需要注入IServiceA
并将其解析为ServiceA
。这也使WCF在注册ServiceA
时不会中断。