2014-10-14 13 views
16

Ciao, ho un'applicazione MVC in cui ho definito alcune dipendenze alla mia API Web.Come si risolvono i controller API Web utilizzando Autofac in un'API Web mista e un'applicazione MVC?

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

Poi nella mia classe di avvio automatico sto chiamando in Application_Start come segue:

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

Quando il debug del codice, posso vedere ci sono le registrazioni di tutti i servizi con la mia DependencyResolver, ma sono ancora ricevendo il seguente errore:

An error has occurred.Type 'WebApp.Controllers.AuthenticateController' does not have a default constructor

Qui è il codice per il mio controller:

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

} 

Come posso portare i parametri ai controller api. I controller semplici funzionano correttamente. guida

+0

hai registrato i tuoi controller chiamando 'builder.RegisterApiControllers (Assembly.GetExecutingAssembly());'? – nemesv

+0

dare un'occhiata a questo: http://stackoverflow.com/questions/9450282/autofac-and-asp-net-web-api-apicontroller – freshbm

+0

@freshbm Sì, ho visto che, non ha ottenuto la soluzione: -S – progrAmmar

risposta

5

di nemesv ha fatto il trucco

builder.RegisterApiControllers(Assembly.GetExecutingAssembly())

Calling builder.RegisterApiControllers prima di chiamare builder.Build()

40

vorrei suggerire quanto segue per fare questo lavoro nella vostra applicazione sia con MVC e WebAPI.

Prima il progetto dovrà avere i riferimenti al seguente

  • Autofac
  • Autofac.WebApi
  • Autofac.Mvc5 (cambiare il numero alla fine per abbinare il vostro ASPNET versione MVC)

Quindi nella registrazione Autofac è necessario quanto segue che registri entrambi i controller MVC e WebApi e qualsiasi altra registrazione richiesta. Quindi collegare il contenitore sia a DI di MVC che a DI di WebApi.

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 

Spero che questo aiuti.

+2

'GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver (contenitore IContainer);' Questo è il bit killer nel mio caso. – droidbot

+1

Questo lo ha risolto per me grazie! Mi sono anche reso conto di aver installato il pacchetto nuget errato mentre stavo usando WebApi2. Quindi, una volta rimosso Autofac.WebApi e installato Autofac.WebApi2, tutto ha funzionato come un vero e proprio fascino, grazie a @jonhoare – Jennet

+0

Ne ho davvero avuto bisogno! –

Problemi correlati