在ASP.NET应用程序中托管的WCF服务中使用Autofac作为DI

前端之家收集整理的这篇文章主要介绍了在ASP.NET应用程序中托管的WCF服务中使用Autofac作为DI前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用Autofac 1.4.5将服务依赖关系注入到我的WCF服务中.我已经阅读并遵循了 Autofac wiki page on WcfIntegration,但我的调试显示了我的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.

干杯,奥利弗

解决方法

您的服务设置是否与InstanceContextMode.Single?如果是,则wcf将使用默认构造函数创建您的服务.为了解决这个变化,您的实例上下文模式,并让自动填充管理您的服务的生命周期.

猜你在找的asp.Net相关文章