Внедрение зависимости ломает мой контроллер WebApi

У меня есть проект MVC, использующий шаблон DI в моих контроллерах, используя Unity для разрешения моих зависимостей.

Недавно я представил пакет WebApi, и это произошло после появления досадной ошибки.

Когда я пытаюсь внедрить свой класс обслуживания в контроллер веб-API, я получаю следующую ошибку:

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

Это код

public class TestController : ApiController
{
    private readonly IBrokerService _brokerAccessService;
    public TestController(IBrokerService brokerAccessService)
    {
        _brokerAccessService = brokerAccessService;
    }

    /// Controller methods here

}

Я могу добавить такой конструктор без параметров, и он отлично работает

        public TestController()
    {
        _brokerAccessService = new BrokerService(new BrokerRepository(new ForexRebatesNowEntities()));
    }

Но это полностью нарушает шаблон DI.

У меня эта служба внедрена в другие контроллеры (производные от MVC BaseController, а не от WebApi ApiController), и проблем нет.

Есть ли разница в том, как контроллеры MVC и контроллеры APi обрабатывают DI?

Дубликат? stackoverflow.com/questions/24254189/…

Steven 13.09.2018 19:02

Дубликат? stackoverflow.com/a/39301219/264697

Steven 13.09.2018 19:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
654
2

Ответы 2

Похоже, ваш Resolver зависимостей не настроен для WebAPI. Если вы перешли от использования контроллера к контроллеру WebApi, DependencyResolver будет другим. Для вашего обычного контроллера MVC вы, возможно, выполняли вызов, аналогичный DependencyResolver.SetResolver(), но для контроллера DI для WebApi необходимо, чтобы его преобразователь зависимостей был отключен от HttpConfiguration, что-то вроде httpConfiguration.DependencyResolver =

Например, в некоторых проектах я использую SimpleInjector (идея должна быть такой же) -

Конфигурация MVC DI:

DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(mvcContainer));

Конфигурация WebAPI:

httpConfiguration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(apiContainer);

В качестве побочного примечания - эти вызовы находятся в одном проекте, где у нас есть контроллер MVC и WebApi в одном решении.

Это будет так - преобразователя зависимостей не существует для создания контроллера с аргументами.

Phil Cooper 13.09.2018 16:47

Вы установили преобразователь зависимостей в свойстве DependencyResolver глобального объекта HttpConfiguration?

public static void Register(HttpConfiguration config)
{
  var container = new UnityContainer();
  container.RegisterType<IBrokerService, BrokerService>(new              
                    HierarchicalLifetimeManager());;
  config.DependencyResolver = new UnityResolver(container);
}

Или

Создайте UnityConfig.cs в папке App_Start

    public static class UnityConfig
{
    public static void RegisterComponents()
    {
        var container = new UnityContainer();

        // register all your components with the container here
        // it is NOT necessary to register your controllers

        // e.g. container.RegisterType<ITestService, TestService>();
        container.RegisterType<IBrokerService, BrokerService>();
        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    }
}

Затем вызовите этот статический метод в Global.asax.cs

     protected void Application_Start()
    {
        //Register your unity configuration
        UnityConfig.RegisterComponents();            
    }

Другие вопросы по теме