Интегрируйте Simple Injector в сайт MVC 5, на котором также есть несколько контроллеров Web Api 2 - PullRequest
0 голосов
/ 18 октября 2018

У меня есть проект ASP.NET MVC 5, использующий шаблон по умолчанию, который использует ASP.NET Identity 2. Знаете, тот, у которого этот ужасный бедный человек вводит зависимость с помощью OwinContext и AccountController.

Я успешно смог интегрировать SI 4.3.0 в проект, следуя этому примеру .Он показывает и старый синтаксис, но с некоторыми изменениями он заработал.Теперь я с удовольствием внедряю зависимости в AccountController и могу легко написать тесты для него.

Проблема в том, что у меня также есть несколько контроллеров Web Api 2 в том же проекте MVC, и я 'Я не уверен, как мне интегрировать SI, чтобы он работал.

public static class WebApiConfig
{
  public static void Register(HttpConfiguration config)
  {
    // This ApiDependencyResolver is a custom class and as you can see, 
    // it's being "injected" a value from a static method. Awful. I want to replace this with SI.
    config.DependencyResolver = new ApiDependencyResolver(DataAccessLayerFactory.GetInstance());

    // Use a custom JSON formatter as well so that requests from
    // the browser are returned as properly formatted JSON by default.
    config.Formatters.Add(new ApiJsonFormatter());

    // Set up the Web API routes.
    config.MapHttpAttributeRoutes();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: ApiPrefix + "/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional });
  }
}

Вышеуказанный метод вызывается в Application_Start из Global_asax с использованием GlobalConfiguration.Configure(WebApiConfig.Register);.Но моя настройка контейнера выполняется в Startup.cs (отмечен атрибутом OwinStartup).

У меня уже есть регистрация для DataAccessLayer, и она хорошо работает для контроллеров MVC.Но как только я запускаю действие контроллера API, который в нем нуждается, я получаю ответ: An error occurred when trying to create a controller of type 'TenantsController'. Make sure that the controller has a parameterless public constructor.

Как я могу интегрировать SI в проект MVC5 с некоторыми контроллерами Api?

1 Ответ

0 голосов
/ 19 октября 2018

Таким образом, в документации явно не сказано, как это сделать, но объединение подходов MVC и WebApi, похоже, помогает.

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

// MVC
DependencyResolver.SetResolver(SimpleInjectorDependencyResolver(container));

// Web Api
GlobalConfiguration.Configuration.DependencyResolver = 
   new SimpleInjectorWebApiDependencyResolver(container);

А также нам нужно зарегистрировать контроллеры MVC и WebApi, выполнив:

container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...