Внедрение зависимостей ломает мой контроллер WebApi - PullRequest
0 голосов
/ 13 сентября 2018

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

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

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

"Произошла ошибка при попытке создать контроллер типа 'TestController'. Убедитесь, что контроллер имеет открытый конструктор без параметров."

Это код

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?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Вы установили средство разрешения зависимостей для свойства 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();            
    }
0 голосов
/ 13 сентября 2018

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

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

MVC DI Config:

DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(mvcContainer));

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

httpConfiguration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(apiContainer);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...