В чем разница между DependencyResolver.SetResolver и HttpConfiguration.DependencyResolver в WebAPI

У меня есть существующий проект, который использует AutoFac как IoC.

В регистрационном коде у меня есть следующие строки:

var resolver = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(resolver));
config.DependencyResolver = new AutofacWebApiDependencyResolver(resolver);

Итак, мой вопрос в чем разница между DependencyResolver.SetResolver и HttpConfiguration.DependecyResolver? Почему я должен назначить их оба?

Ответ 1

Предотвратить смешивание MVC и Web API в одном проекте. Microsoft, похоже, предлагает это, потому что шаблон Visual Studio для Web API автоматически смешивает проект с MVC, но это плохая идея.

С архитектурной точки зрения MVC и Web API совершенно разные. MVC - это технология пользовательского интерфейса, предназначенная для оптимизации работы конечных пользователей. Веб-API - это технология веб-сервисов, целью которой является оптимизация опыта для (клиентского) разработчика.

MVC и Web API не используют какой-либо код, специфичный для представления. Смешение их в одном проекте просто делает проект более сложным.

Но, возможно, что еще более важно, оба типа приложений имеют свои собственные настройки конфигурации DI. У них есть собственный Root Composition и смешивание этого в одну конфигурацию DI (один контейнер DI) может сделать вашу конфигурацию необычайно трудной.

И, наконец, смешивание веб-API с MVC в одном проекте приводит к болезненным неоднозначным конфликтам имен, поскольку сборки Web API содержат много классов, которые имеют то же имя, что и MVC-копии (но с немного разными реализациями).

Ответ 2

Я предполагаю, что вы перепутали MVC и Web API:

DependencyResolver.SetResolver

является для MVC и принадлежит сборке System.Web.Mvc. В противном случае:

Configuration.DependencyResolver

для Web APi, он принадлежит сборке System.Web.Http.

Итак, в вашем проекте он использует MVC и Web Api, поэтому вы видите две строки для настройки IoC для каждого

Ответ 3

DependencyResolver.SetResolver является конструкцией MVC и требуется для поддержки IOC с использованием MVC.

GlobalConfiguration.Configuration.DependencyResolver является специфичным для WebApi.

Вам понадобятся только оба варианта, если вы хотите поддерживать как MVC, так и WebApi в одном проекте.

Также может быть полезно указать, что вам обычно не нужно явно устанавливать DependencyResolver.SetResolver, поскольку у Ninject Mvc3 есть загрузочный файл для этого... см. здесь