Используя Autofac для DI на службу WCF, размещенную в приложении ASP.NET

Я испытываю затруднения при введении сервисных зависимостей в мое сервисное использование WCF Autofac 1.4.5. Я считал и следовал за страницей Wiki Autofac на 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();
        builder.Register().ContainerScoped();
    }
}

В моем web.config я имею


    
        
    

.

Сервис уже хорошо работает, но я не могу получить биты 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.

С наилучшими пожеланиями, Oliver

14
задан Oliver 30 July 2010 в 18:03
поделиться

2 ответа

Попробуйте удалить конструктор по умолчанию Ajax и изменить ваш конструктор на этот. Если он запускается с mapWebService == null, это указывает на проблему разрешения.

    public Ajax(MapWebService mapWebService = null)
    {
        // this constructor should be called
        MapWebService = mapWebService;
    }
0
ответ дан 1 December 2019 в 16:59
поделиться

Установлена ​​ли ваша служба с InstanceContextMode.Single? Если это так, то wcf создаст вашу службу, используя конструктор по умолчанию. Чтобы обойти это, измените режим контекста вашего экземпляра и позвольте autofac управлять временем жизни вашей службы.

1
ответ дан 1 December 2019 в 16:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: