我在使用 Autofac 1.4.5 将服务依赖项注入我的 WCF 服务时遇到问题。我已经阅读并关注了WcfIntegration 上的 Autofac wiki 页面,但我的调试显示我的 WCF 服务是由该System.ServiceModel.Dispatcher.InstanceBehavior.GetInstance()
方法创建的,而不是由AutofacWebServiceHostFactory
. 我究竟做错了什么?
我已将我的ajax.svc
文件设置为与示例中的文件类似,以用于WebHttpBinding
:
<%@ ServiceHost Language="C#" Debug="true"
Service="Generic.Frontend.Web.Ajax, Generic.Frontend.Web"
Factory="Autofac.Integration.Wcf.AutofacWebServiceHostFactory,
Autofac.Integration.Wcf" %>
我的 WCF 服务类Ajax
是这样定义的:
namespace Generic.Frontend.Web
{
[ServiceContract]
[AspNetCompatibilityRequirements(
RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Ajax
{
public MapWebService MapWebService { get; set;}
public Ajax() {
// this constructor is being called
}
public Ajax(MapWebService mapWebService)
{
// this constructor should be called
MapWebService = mapWebService;
}
[WebGet(ResponseFormat = WebMessageFormat.Json)]
[OperationContract(Name = "mapchange")]
public MapChangeResult ProcessMapChange(string args)
{
// use the injected service here
var result = MapWebService.ProcessMapChange(args);
return result;
}
}
}
现在我已经使用了Global.asax.cs
上面提到的 wiki 中所示的接线:
var builder = new ContainerBuilder();
builder.RegisterModule(new AutofacModuleWebservice());
var container = builder.Build();
AutofacServiceHostFactory.Container = container;
和
class AutofacModuleWebservice : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.Register<Ajax>();
builder.Register<MapWebService>().ContainerScoped();
}
}
在我的 web.config 我有
<services>
<service name="Generic.Frontend.Web.Ajax">
<endpoint address="http://mysite.com/ajax.svc/" binding="webHttpBinding"
contract="Generic.Frontend.Web.Ajax" />
</service>
</services>
.
该服务已经正常工作,但我无法让 Autofac 位(阅读:创建/注入)工作。有任何想法吗?
编辑: 不幸的是,删除默认构造函数会导致以下异常:
System.InvalidOperationException:
The service type provided could not be loaded as a service because it does not
have a default (parameter-less) constructor. To fix the problem, add a default
constructor to the type, or pass an instance of the type to the host.
干杯,奥利弗