2012-04-27 3 views
5

Я пытаюсь заставить Autofac работать с WebApi. У меня есть ApiControllers в отдельном проекте из основного веб-проекта.ASP.NET WebApi + Autofac не находит ApiControllers

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

Всякий раз, когда я пытаюсь просмотреть на маршрут апи я получаю ответ:

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

Когда я пошагово код I Autofac что мой контроллер зарегистрирован, но AutofacControllerActivator.Create() возвращает значение null. В частности, строка return (ResolutionExtensions.ResolveOptional (scope, controllerType) как IHttpController);

Код автофокуса: строка 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)); 

Я что-то не хватает?

Благодаря

+0

Является ли местоположение сборки, которое вы предоставляете зарегистрированным пользователям? Я получил ту же ошибку, когда ошибся со своим именем сборки. – Gavin

+0

@Gavin да, потому что мой апик-рунтроллер действительно регистрируется. Это просто решение, которое, похоже, терпит неудачу. – user695595

ответ

0

Вы позабыв зарегистрировать зависимости конструктора для контроллеров Api с контейнером сборки?

HostingEnvironment.MapPath ("~/bin") - еще один хороший способ получить путь к файлу в каталоге bin.

+0

К сожалению, это не помогло. – user695595

1

Расширение регистрации RegisterApiControllers ищет типы, которые реализуют интерфейс IHttpController и имеют имя, которое заканчивается на «Контроллер». У ваших имен классов контроллера есть суффикс «Контроллер»?

+0

Да, он в конечном итоге реализует IHttpController, и имя также заканчивается контроллером. Кроме того, если я поставил свой контроллер api в основной проект, он отлично работает. Я попытаюсь создать тестовый проект, чтобы продемонстрировать проблему. – user695595

+0

Я также не уверен, что lifetimeScope.ResolveOptional (controllerType) возвращает null или литой в IHttpController. В любом случае, я могу проверить это легко? – user695595

+0

(мы работаем в одном и том же месте, таким образом, у меня есть доступ к коду): builder.RegisterApiControllers (typeof (InventorySystem.Web.Api.Controllers.InventoryController) .Сборка) .PropertiesAutowired(); исправлена ​​проблема, однако мы хотели бы иметь возможность использовать Assembly.Load, чтобы мы могли переключаться между реализациями, а что нет. Пожалуйста, совет, почему мы видим это поведение. (И: Спасибо за модуль интеграции Autofac! Мы любим Autofac и все, что хорошо сочетается с ним) –

2

Возможно, вы захотите посмотреть на этот SO question, где другой сборка взята из одного из ссылок API-контроллеров.

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