2012-04-27 16 views
5

Staram się, aby Autofac działał z WebApi. Mam swoje ApiControllery w osobnym projekcie z głównego projektu internetowego.ASP.NET WebApi + Autofac nie znajduje ApiControllers

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

Ilekroć próbuję przeglądać na trasie api otrzymuję odpowiedź:

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

kiedy krok poprzez kod Autofac I zobacz, że mój kontroler został zarejestrowany, ale funkcja AutofacControllerActivator.Create() zwraca wartość null. Zwłaszcza linia zwraca (ResolutionExtensions.ResolveOptional (scope, controllerType) jako IHttpController);

Kod autofac: string 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)); 

Czy brakuje mi czegoś?

Dzięki

+0

Czy miejsce montażu, które dostarczasz do rejestru. Sterowniki zdecydowanie poprawiają się? Ten sam błąd popełniłem, gdy popełniłem błąd przy nazwie zespołu. – Gavin

+0

@Gavin tak, ponieważ mój apicontroller się rejestruje. To tylko rozwiązanie, które wydaje się zawodzić. – user695595

Odpowiedz

0

Czy zapominając zarejestrować zależności konstruktora dla kontrolerów api z pojemnikiem kompilacji?

HostingEnvironment.MapPath ("~/bin") to kolejny dobry sposób na uzyskanie ścieżki do pliku w katalogu bin.

+0

Niestety to nie pomogło. – user695595

1

Rozszerzenie rejestracji RegisterApiControllers szuka typów, które implementują interfejs IHttpController i mają nazwę, która kończy się na "Controller". Czy nazwy klas kontrolera mają przyrostek "Kontrolera"?

+0

Tak, implementuje w końcu IHttpController, a nazwa również kończy się na kontrolerze. Ponadto, jeśli umieściłem mój kontroler api w głównym projekcie, to działa dobrze. Postaram się stworzyć projekt testowy, aby zademonstrować problem. – user695595

+0

Nie jestem również pewien, czy lifetimeScope.ResolveOptional (controllerType) zwraca wartość null lub rzutowanie na IHttpController. W jaki sposób mogę to łatwo sprawdzić? – user695595

+0

(pracujemy w tym samym miejscu, więc mam dostęp do kodu): builder.RegisterApiControllers (typeof (InventorySystem.Web.Api.Controllers.InventoryController) .Assembly) .PropertiesAutowired(); Naprawiono problem, jednak chcielibyśmy móc użyć Assembly.Load, abyśmy mogli przełączać się między implementacjami, a co nie. Porada, dlaczego widzimy to zachowanie. (A: Dzięki za moduł integracji z Autofac! Kochamy Autofac i wszystko, co się z nim dobrze integruje) –

2

Być może zechcesz rzucić okiem na to SO question, gdzie inny zestaw jest odbierany od jednego z referencyjnych kontrolerów API.

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