8

Sto scrivendo l'API Web utilizzando Iniezione di dipendenza, Unità di lavoro con l'aiuto di repository e Autofac come contenitore. Dipendenza si stava iniettato perfettamente 24 ore fa, ma improvvisamente quando ho iniziato oggi a lavorare ho continuato a ricevere l'erroreWebApi DI Autofac - Assicurarsi che il controllore disponga di un costruttore pubblico senza parametri

"messaggio": "Si è verificato un errore", "ExceptionMessage": "un errore è verificato durante il tentativo per creare un controller di tipo 'SearchController' assicurarsi che il controller ha un costruttore senza parametri pubblica ", "ExceptionType..": "System.InvalidOperationException",

I comprenderà le mie firme e come mi sto registrando i tipi e sarei davvero felice se qualcuno potesse indicarmi quale mi Non posso sbagliare con il mio codice.

Il mio controller Web API, ho

private IUnitOfWork<Listing> _unitOfWork = null; 
public SearchController(IUnitOfWork<Listing> unitOfWork) 
{ 
    _unitOfWork = unitOfWork; 
} 

unità di lavoro prende il parametro di tipo generico per creare repository.

Nei miei WebApiConfig.cs, che sto registrando i tipi come sotto

builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)); 
builder.RegisterGeneric(typeof(UnitOfWork<>)).As(typeof(IUnitOfWork<>)).InstancePerDependency(); 
builder.RegisterType(typeof(SearchController)).UsingConstructor(typeof(IUnitOfWork<Listing>)); 

Sto registrando il SearchController per utilizzare il costruttore che prende in IUnitOfWork <>. Funzionava tutto bene prima di aver aggiunto i test di unità Mocked ma per qualche motivo continuo a ricevere questo errore ora. Ho anche registrato il DependencyResolver

var container = builder.Build(); 
var resolver = new AutofacWebApiDependencyResolver(container); 
config.DependencyResolver = resolver; 

risposta

6

Come ci sono un bel paio di upvotes su questa domanda senza risposte ancora ed io non ricordo esattamente come ho fatto il lavoro, ma voglio condividere l'ultima tecnica che ha ha funzionato perfettamente in molti progetti.

1) Questo è come posso registrare la mia repsoitory generico e unità di lavoro

builder.RegisterType(typeof(YourContextInRepository)); 
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)); 
builder.RegisterGeneric(typeof(UnitOfWork<>)).As(typeof(IUnitOfWork<>)); 

2) Questo è come ho configurato il risolutore di dipendenza per il mio WebAPI

// Set the dependency resolver for Web API. 
var webApiResolver = new AutofacWebApiDependencyResolver(container); 
GlobalConfiguration.Configuration.DependencyResolver = webApiResolver; 

3) per registrarlo per controller MVC,

// Set MVC DI resolver to use our Autofac container 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

Questo approccio funziona su MVC e su controller WebAPI e posso semplificare y do

private IUnitOfWork<Listing> _uow; 
public SearchController(IUnitOfWork<Listing> uow) 
{ 
    _uow = uow; 
} 

Spero che aiuti qualcuno in futuro.

+1

Ali, ho provato il vostro esempio e ottengo lo stesso errore "costruttore pubblico senza parametri" per WebAPI. È lo stesso messaggio se ho usato il codice MVC AutoFac. Ho questo nelle applicazioni MVC, ma in perdita su questo. C'è qualche altra direzione che puoi condividere? –

1

Ho affrontato lo stesso problema e il problema era che stavo utilizzando i campioni di codice Autofac per l'oggetto ContainerBuilder() per i controller MVC e non per l'API.

Here is un buon campione come configurarlo con ApiController