2012-04-27 6 views
5

Ich versuche Autofac mit WebApi zu arbeiten. Ich habe meine ApiControllers in einem separaten Projekt vom Haupt-Webprojekt.ASP.NET WebApi + Autofac nicht finden ApiControllers

InventorySystem.Web.UI InventorySystem.Web.Api.Controllers

Jedes Mal, wenn ich versuche, auf eine api Route zu durchsuchen i die Antwort erhalten:

<Exception xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <ExceptionType>System.ArgumentNullException</ExceptionType> 
    <Message>Value cannot be null. Parameter name: value</Message> 
    <StackTrace> 
at System.Web.Http.Controllers.HttpControllerContext.set_Controller(IHttpController value) 
at System.Web.Http.Dispatcher.DefaultHttpControllerFactory.CreateInstance(HttpControllerContext controllerContext, HttpControllerDescriptor controllerDescriptor) 
at System.Web.Http.Dispatcher.DefaultHttpControllerFactory.CreateController(HttpControllerContext controllerContext, String controllerName) 
at Autofac.Integration.WebApi.AutofacControllerFactory.CreateController(HttpControllerContext controllerContext, String controllerName) 
at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage request, CancellationToken cancellationToken) 
at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    </StackTrace> 
</Exception> 

Wenn ich den Autofac Code Ich trete durch Beachten Sie, dass mein Controller registriert wurde, aber AutofacControllerActivator.Create() gibt null zurück. Insbesondere wird die Zeile zurückgegeben (ResolutionExtensions.ResolveOptional (scope, controllerType) als IHttpController);

Der Autofac-Code: Zeichenfolge binDirectory = Path.Combine (HttpRuntime.AppDomainAppPath, "bin");

 var builder = new ContainerBuilder(); 

     builder.ConfigureWebApi(GlobalConfiguration.Configuration); 

     builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired(); 
     builder.RegisterApiControllers(Assembly.LoadFile(Path.Combine(binDirectory, "InventorySystem.Web.Api.dll"))).PropertiesAutowired(); 
     builder.RegisterFilterProvider();    

     var container = builder.Build(); 

     DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
     GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new AutofacWebApiDependencyResolver(container)); 

Fehle ich etwas?

Dank

+0

Ist der Montageort, den Sie für RegisterAPIControllers bereitstellen, definitiv korrekt? Ich habe den gleichen Fehler, als ich einen Fehler mit meinem Assemblynamen gemacht habe. – Gavin

+0

@Gavin ja, weil mein apicontroller registered wird. Es ist nur die Auflösung, die zu versagen scheint. – user695595

Antwort

0

vergessen, Sie Konstruktor Abhängigkeiten für Ihre Api-Controller mit dem Build-Container registrieren?

HostingEnvironment.MapPath ("~/bin") ist eine weitere gute Möglichkeit, den Pfad zu einer Datei im bin-Verzeichnis abzurufen.

+0

Leider hat das nicht geholfen. – user695595

1

Die RegisterApiControllers Registrierungserweiterung sucht nach Typen, die die IHttpController Schnittstelle implementieren und einen Namen haben, der mit "Controller" endet. Haben Ihre Controller-Klassennamen das Suffix "Controller"?

+0

Ja, es implementiert schließlich IHttpController und der Name endet auch mit Controller. Auch, wenn ich meine API-Controller in das Hauptprojekt setzen, funktioniert es gut. Ich werde versuchen, ein Testprojekt zu erstellen, um das Problem zu demonstrieren. – user695595

+0

Ich bin mir auch nicht sicher, ob lifetimeScope.ResolveOptional (controllerType) null oder die Besetzung zu IHttpController zurückgibt. Kann ich das leicht überprüfen? – user695595

+0

(wir arbeiten an der gleichen Stelle, also habe ich Zugriff auf den Code): builder.RegisterApiControllers (typeof (InventorySystem.Web.Api.Controllers.InventoryController). Assembly) .EigenschaftenAutowired(); behebt das Problem, jedoch möchten wir in der Lage sein, Assembly.Load zu verwenden, damit wir zwischen den Implementierungen wechseln können und was nicht. Bitte beachten Sie, warum wir dieses Verhalten sehen. (Und: Danke für das Autofac-Integrationsmodul! Wir lieben Autofac und alles, was gut damit integriert ist) –

2

Sie möchten vielleicht einen Blick auf diese SO question werfen, wo die andere Assembly ab einer der Referenzen API Controller abgeholt wird.

0
var builder = new ContainerBuilder(); 
builder.Update(container); 
var webApiResolver = new Autofac.Integration.WebApi.AutofacWebApiDependencyResolver(container); 
    System.Web.Http.GlobalConfiguration.Configuration.DependencyResolver = webApiResolver;