2016-05-31 4 views
9

Ich weiß, dass es schon gefragt und beantwortet wurde - der Grund, warum ich frage, ist, weil ich alle vorgeschlagenen Lösungen für dieses Problem versucht habe, aber immer noch nicht lösen kann es.Autofac - Stellen Sie sicher, dass der Controller einen parameterlosen öffentlichen Konstruktor hat

Ich habe ein ASP.NET Web API 2.0-Projekt. Ich habe Autofac, Autofac.Mvc5 und Autofac.WebApi2 Abhängigkeiten installiert. Wenn ich versuche, eine API-Controller nennen ich die folgende Fehlermeldung erhalten:

An error occurred when trying to create a controller of type 'MyController'. Make sure that the controller has a parameterless public constructor.

In meinem Global.asax habe ich einen Anruf an IocConfig.Config(), die ich in App_Start gesetzt haben:

public static class IocConfig 
{ 
    public static void Config() 
    { 
     var builder = new ContainerBuilder(); 

     builder.RegisterType<MyLogger>().As<IMyLogger>(); 

     builder.RegisterApiControllers(Assembly.GetCallingAssembly()); 
     builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); 

     WebApiApplication.Container = builder.Build(); 

     DependencyResolver.SetResolver(
      new AutofacDependencyResolver(WebApiApplication.Container)); 
     GlobalConfiguration.Configuration.DependencyResolver = 
      new AutofacWebApiDependencyResolver(WebApiApplication.Container); 
    } 
} 

Und dies ist der Konstruktor für MyController:

public MyController(IMyLogger logger) 

Wenn ich versuche, es zu nennen ich den angegebenen Fehler über den Konstruktor erhalten. Was vermisse ich?

+0

War diese gelöst? Ich habe das gleiche Problem. Ich benutze Asp.Net Web api2.0 – Kanchana

Antwort

-1

Ich denke, Sie vermissen die Registrierung von Autofac bei App Startcode. diese

Verwendung:

protected void Application_Start() 
{ 
    IocConfig.Config(); 
    AreaRegistration.RegisterAllAreas(); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 
} 

Weitere Einzelheiten finden Sie diesen Blog http://www.codeproject.com/Articles/808894/IoC-in-ASP-NET-MVC-using-Autofac

+0

Wie ich in der ursprünglichen Frage schrieb "In meinem Global.asax habe ich einen Aufruf an IocConfig.Config(), den ich innen gelegt habe" - Es bricht sogar in der Konfiguration selbst - so es läuft definitiv. – developer82

+0

sollte es innerhalb von Application_Start aufgerufen werden, da dies einmal für die Lebensdauer der Anwendungsdomäne aufgerufen wird. –

+0

Es wird einmal aufgerufen. Es ist wie im 'Application_Start' erwähnt. Auch das Verschieben des Codes außerhalb der eigenen Methode direkt zum 'Application_Start' funktioniert immer noch nicht. – developer82

3

Assembly.GetCallingAssembly() wird die anrufende Baugruppe zurückzukehren, nicht die Montage, wo Ihre Arten definiert ist.

Assembly.GetCallingAssembly Method
Returns the Assembly of the method that invoked the currently executing method.

Um es funktioniert zu machen, Sie typeof(IocConfig).Assembly oder Assembly.GetExecutingAssembly

+0

Ich habe bereits versucht 'Assembly.GetExecutingAssembly' auch versucht Sie Vorschlag' typeof (IocConfig) .Assembly' - immer noch den gleichen Fehler – developer82

6

ich auch begegnet diesen Fehler und die Ursache war verwenden sollte, dass einer der Abhängigkeiten des Controllers nicht richtig in Autofac registriert wurde.

Die InnerException hat die Details (in meinem Fall war es eine Autofac.Core.DependencyResolutionException) und die ExceptionMessage enthalten die Details dieser Abhängigkeit. In Analogie zu:

"An error occurred during the activation of a particular registration... Cannot resolve parameter 'XXXX'

3

Überprüfen Sie this answer.
Es hilft mir, korrekte ContainerBuilder() für WebApi-Controller zu konfigurieren.

Wenn Sie hier eine Lösung für einen solchen Fehler suchen, sollten Sie zuerst Ihre DependencyResolver-Konfiguration überprüfen.

Ich konfrontiert mit dem gleichen Problem, und das Problem war, dass ich Autofac-Codebeispiele für ContainerBuilder() Objekt für MVC-Controller und nicht API verwendet.

für das Register Mein Code beide Art von Controller (MVC und Api):

var builder = new ContainerBuilder(); 
builder.RegisterControllers(Assembly.GetExecutingAssembly()); //Register MVC Controllers 
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); //Register WebApi Controllers 
builder.RegisterType<Type>().As<IType>(); 

var container = builder.Build(); 

DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); //Set the MVC DependencyResolver 
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver((IContainer)container); //Set the WebApi DependencyResolver 
Verwandte Themen