微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在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将使用认构造函数创建您的服务.为了解决这个变化,您的实例上下文模式,并让自动填充管理您的服务的生命周期.

原文地址:https://www.jb51.cc/aspnet/250164.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐