В чем разница между 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 есть загрузочный файл для этого... см. здесь