У меня есть проект 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/a/39301219/264697
Похоже, ваш 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 в одном решении.
Это будет так - преобразователя зависимостей не существует для создания контроллера с аргументами.
Вы установили преобразователь зависимостей в свойстве 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();
}
Дубликат? stackoverflow.com/questions/24254189/…