web-dev-qa-db-fra.com

Comment résoudre les contrôleurs d'API Web à l'aide d'Autofac dans une application Web API et MVC mixte?

Salut j'ai une application MVC où j'ai défini certaines dépendances à mon 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;
    }
}

Ensuite, dans ma classe bootstrapper, je l'appelle dans Application_Start comme suit:

GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependenceResolver((IContainer)container);

Lorsque je débogue le code, je peux voir qu'il y a des enregistrements de tous les services avec mon DependencyResolver, mais j'obtiens toujours l'erreur suivante:

Une erreur s'est produite. Le type 'WebApp.Controllers.AuthenticateController' n'a pas de constructeur par défaut

Voici le code de mon contrôleur:

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;
     }

}

Comment puis-je apporter des paramètres aux contrôleurs api. Les contrôleurs simples fonctionnent bien.

23
progrAmmar

les conseils de Nemesv ont fait l'affaire

builder.RegisterApiControllers(Assembly.GetExecutingAssembly())

Appeler builder.RegisterApiControllers Avant d'appeler builder.Build()

8
progrAmmar

Je suggère ce qui suit pour que cela fonctionne dans votre application avec MVC et WebApi.

Tout d'abord, votre projet devra avoir des références aux éléments suivants

  • Autofac
  • Autofac.WebApi
  • Autofac.Mvc5 (changez le numéro à la fin pour qu'il corresponde à votre version mvc aspnet)

Ensuite, dans votre enregistrement Autofac, vous aurez besoin des éléments suivants qui enregistreront les contrôleurs MVC et WebApi et tous les autres enregistrements dont vous avez besoin. Attachez ensuite le conteneur à la fois au MVC DI et au 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

J'espère que ça aide.

55
jonhoare