Я испытываю затруднения при введении сервисных зависимостей в мое сервисное использование 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
Попробуйте удалить конструктор по умолчанию Ajax
и изменить ваш конструктор на этот. Если он запускается с mapWebService == null
, это указывает на проблему разрешения.
public Ajax(MapWebService mapWebService = null)
{
// this constructor should be called
MapWebService = mapWebService;
}
Установлена ли ваша служба с InstanceContextMode.Single? Если это так, то wcf создаст вашу службу, используя конструктор по умолчанию. Чтобы обойти это, измените режим контекста вашего экземпляра и позвольте autofac управлять временем жизни вашей службы.