2015-02-17 1 views
2

Проблема была замечена вызовом метода расширения container.RegisterWebApiControllers(GlobalConfiguration.Configuration) на контейнере, который должен зарегистрировать контроллер веб-api с контейнером, но не сделал этого. Обратите внимание, что контроллеры веб-api определены в другом проекте библиотеки классов и подключены к запуску приложения с использованием настраиваемого типа IAssembliesResolver.Контейнер простого инжектора не может зарегистрировать контроллер веб-API из внешней библиотеки Pluggedin

public static class SimpleInjectorWebApiInitializer 
{ 
    public static void Initialize() 
    { 
     var container = new Container(); 

     GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), 
      new ApiAssemblyResolver()); 

     InitializeContainer(container); 

     container.RegisterWebApiControllers(GlobalConfiguration.Configuration); 

     container.Verify(); 

     GlobalConfiguration.Configuration.DependencyResolver = 
      new SimpleInjectorWebApiDependencyResolver(container); 
    } 

Я даже пытался позвонить, чтобы получить ControllerTypes вручную, чтобы увидеть, что происходит с помощью кода ниже, но это никогда не срабатывает метод GetAssemblies ни сделал это вернуть любой ControllerTypes.

var controllerTypes = httpConfigServicesContainer.GetHttpControllerTypeResolver() 
    .GetControllerTypes(
     GlobalConfiguration.Configuration.Services.GetAssembliesResolver()); 

Я почти выдергиваю все свои волосы, так как я не могу видеть, что я делаю неправильно. Заранее благодарны за Вашу помощь.

+0

Какую версию Простой инжектор вы используете? – Steven

+0

Я использую версию 2.7.2. –

ответ

1

Решение было выполнено в порядке, в котором были выполнены вызовы конфигурации. Я переместил каждый вызов конфигурации с использованием контейнера IOC в метод Application_Start файла Global.asax.

Перед тем, как вызов GlobalConfiguration.Configure(WebApiConfig.Register), я уже назвал

GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), new ApiAssemblyResolver()) 

для замены сборок по умолчанию распознаватель в. Я, наконец, поместил другие настройки конфигурации web-сервера контейнера после каждого другого вызова конфигурации и начал работать как шарм! I.e

var apiIOCContainer = new Container(); 
SimpleInjectorWebApiInitializer.InitializeContainer(apiIOCContainer); 
apiIOCContainer.RegisterWebApiControllers(GlobalConfiguration.Configuration); 
GlobalConfiguration.Configuration.DependencyResolver = 
new SimpleInjectorWebApiDependencyResolver(apiIOCContainer); 
1

Трудно быть очень конкретным, но вот список вещей, которые могут быть причиной ваших диспетчерам не зарегистрировано:

  • Ваш ApiAssemblyResolver не возвращает узел, который содержит контроллеры.
  • Эта сборка представляет собой динамическую сборку (что означает, что Assembly.IsDynamic возвращает true). Web API пропустит динамические сборки.
  • Типы контроллеров являются внутренними. Web API использует только общедоступные типы.
  • Типы контроллеров не являются классами (но структурами).
  • Их название типа не заканчивается на «Контроллер»
  • Они не используют IHttpController.
  • Ваш IAssembliesResolver не зарегистрирован правильно (возможно, вам не хватает переадресации связывания, в результате чего ваше приложение ссылается на две версии Web API). Совет. Проверьте, что для типа GlobalConfiguration.Configuration.Services.GetAssembliesResolver() фактически решает.

попробовать также следующее:

var controllerTypes = httpConfigServicesContainer.GetHttpControllerTypeResolver() 
    .GetControllerTypes(new ApiAssemblyResolver()); 

ли этот результат в любых контроллерах? В этом случае, возможно, что-то пропустит с вызовом Replace(typeof(IAssembliesResolver).

+0

Я выполнил все проверки, упомянутые выше, и все кажется точным. Я также попытался вернуть controllerTypes в последнее предложение, и ничего не было возвращено! Vis-a-vis, я создал другое решение и воспроизвел то же самое и SHAZAM! он работал там, но не в моем основном проекте. –

+0

@OswaldUmeh: Это действительно странно, но по крайней мере мы можем исключить здесь несколько вещей. Проблема заключается не в простом инжекторе, поскольку он просто использует сконфигурированный 'IHttpControllerTypeResolver', который не возвращает контроллеров. Мой совет - создать новый пустой проект и попытаться воспроизвести его оттуда или разбить решение на абсолютный минимум, который воспроизводит проблему. Это часто поможет вам определить причину. Удачи – Steven

+1

Хорошо и спасибо за вашу помощь. Я отправлю решение, когда найду его. –

Смежные вопросы