c# - tutorial - ¿Cómo resuelvo los controladores de API web utilizando Autofac en una aplicación mixta de API web y MVC?
web api rest c# (2)
Hola, tengo una aplicación MVC donde he definido algunas dependencias para mi API web.
public class AutofacWebApiDependenceResolver : IDependencyResolver
{
private readonly IComponentContext container;
public AutofacWebApiDependenceResolver(IContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
this.container = container;
}
public object GetService(Type serviceType)
{
if (serviceType == null)
{
throw new ArgumentNullException("serviceType");
}
var ret = this.container.ResolveOptional(serviceType) ;
return ret;
}
public IEnumerable<object> GetServices(Type serviceType)
{
if (serviceType == null)
{
throw new ArgumentNullException("serviceType");
}
Type enumerableType = typeof(IEnumerable<>).MakeGenericType(serviceType);
var ret = (IEnumerable<object>)this.container.ResolveOptional(enumerableType);
return ret;
}
}
Luego en mi clase de bootstrapper lo estoy llamando en Application_Start de la siguiente manera:
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependenceResolver((IContainer)container);
Cuando depuro el código, puedo ver que hay registros de todos los servicios con mi DependencyResolver, pero todavía recibo el siguiente error:
Se ha producido un error. Escriba ''WebApp.Controllers.AuthenticateController'' no tiene un constructor predeterminado
Aquí está el código de mi controlador:
public class AuthenticateController : ApiController
{
private readonly IFormsAuthenticationService formsAuthenticationService;
private readonly IMemberShipProvider memberShip;
private readonly IDataService dataService;
public AuthenticateController(
IMemberShipProvider memberShip,
IFormsAuthenticationService formsAuthenticationService, IDataService dataService)
{
this.memberShip = memberShip;
this.formsAuthenticationService = formsAuthenticationService;
this.dataService= dataService;
}
}
¿Cómo puedo traer parámetros a los controladores de api. Los controladores simples están funcionando bien.
Yo sugeriría lo siguiente para hacer que esto funcione en su aplicación con MVC y WebApi.
Primero su proyecto necesitará tener referencias a lo siguiente
- Autofac
- Autofac.WebApi
- Autofac.Mvc5 (cambie el número al final para que coincida con su versión de mvc de aspnet)
Luego, en su registro de Autofac necesitará lo siguiente, que registrará los Controladores MVC y WebApi y cualquier otro registro que requiera. Luego adjunte el Contenedor tanto a MVC DI como a WebApi DI.
var builder= new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly()); //Register MVC Controllers
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); //Register WebApi Controllers
//Register any other components required by your code....
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); //Set the MVC DependencyResolver
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver((IContainer)container); //Set the WebApi DependencyResolver
Espero que esto ayude.
la guía de nemesv hizo el truco
builder.RegisterApiControllers(Assembly.GetExecutingAssembly())
Llamando a builder.RegisterApiControllers
antes de llamar a builder.Build()