visual tutorial studio paso español crear c# asp.net-mvc asp.net-mvc-4 asp.net-web-api autofac

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()