Tengo problemas para inyectar dependencias de servicios en mi servicio WCF utilizando Autofac 1.4.5. He leído y seguido el Autofac wiki page on WcfIntegration pero mi depuración me muestra que mi servicio WCF está creado por el método System.ServiceModel.Dispatcher.InstanceBehavior.GetInstance()
y no por el AutofacWebServiceHostFactory
. ¿Qué estoy haciendo mal?Uso de Autofac para DI en el servicio WCF alojado en la aplicación ASP.NET
He creado mi archivo ajax.svc
para parecerse a la del ejemplo para su uso con WebHttpBinding
:
<%@ ServiceHost Language="C#" Debug="true"
Service="Generic.Frontend.Web.Ajax, Generic.Frontend.Web"
Factory="Autofac.Integration.Wcf.AutofacWebServiceHostFactory,
Autofac.Integration.Wcf" %>
Mi clase de servicio WCF Ajax
se define así:
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;
}
}
}
Ahora He utilizado el cableado en el Global.asax.cs
como se muestra en el wiki mencionado anteriormente:
var builder = new ContainerBuilder();
builder.RegisterModule(new AutofacModuleWebservice());
var container = builder.Build();
AutofacServiceHostFactory.Container = container;
con
class AutofacModuleWebservice : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.Register<Ajax>();
builder.Register<MapWebService>().ContainerScoped();
}
}
En mi web.config que tienen
<services>
<service name="Generic.Frontend.Web.Ajax">
<endpoint address="http://mysite.com/ajax.svc/" binding="webHttpBinding"
contract="Generic.Frontend.Web.Ajax" />
</service>
</services>
.
El servicio ya funciona bien pero no puedo hacer funcionar los bits de Autofac (léase: creación/inyección). ¿Algunas ideas?
Editar: Extracción del constructor por defecto lamentablemente conduce a la siguiente excepción:
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.
Cheers, Oliver
¿Has resuelto esto? Tengo un problema similar y he hecho mi pregunta aquí -> http://stackoverflow.com/questions/16489403/using-autofac-with-ajax-enabled-wcf-service – codingjoe
Desafortunadamente, no. Esa es también la razón por la que no hay nada marcado como respuesta, aquí: - | – Oliver
¿Cómo lo hospedas? iis, fue, selfhosting? Deberías escribir eso en tu pregunta, creo. Usted escribe un código diferente dependiendo de esto. – Johan