Можно ли настроить Autofac для работы с ASP.NET MVC и ASP.NET Web Api
Можно ли настроить Autofac для работы с ASP.NET MVC и ASP.NET Web Api. Я знаю, что зависимые преобразователи разные. Но при использовании документированных подходов я могу установить только один глобальный резольвер.
// Set the dependency resolver implementation.
GlobalConfiguration.Configuration.DependencyResolver = resolver;
Является ли этот подход плохими идеями? Должен ли я отделить свое решение от двух проектов и обрабатывать инъекцию зависимостей для каждого отдельно?
Ответы
Ответ 1
Конечно, можно настроить Autofac для работы с MVC и Web API. Ожидается, что это будет очень распространенный сценарий. Существуют две отдельные реализации зависимостей зависимостей, поскольку MVC и Web API могут использоваться независимо друг от друга. То же самое относится к интеграции Autofac.
При использовании как MVC, так и Web API в одном приложении каждому из них потребуется свой собственный преобразователь зависимостей, хотя они могут быть снабжены одним и тем же экземпляром контейнера.
var builder = new ContainerBuilder();
// Add your registrations
var container = builder.Build();
// Set the dependency resolver for Web API.
var webApiResolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = webApiResolver;
// Set the dependency resolver for MVC.
var mvcResolver = new AutofacDependencyResolver(container);
DependencyResolver.SetResolver(mvcResolver);
Также можно обмениваться регистрациями между ними, потому что области жизни InstancePerApiRequest
и InstancePerHttpRequest
теперь имеют один и тот же тег.
Обратите внимание, что механизм установки зависимого преобразователя для Web API и MVC отличается. Web API использует GlobalConfiguration.Configuration.DependencyResolver
, а MVC использует DependencyResolver.SetResolver
.
Ответ 2
Я думал, что добавлю немного помощи тем, кто борется с этим в mvc5 и web api 2.
Сначала добавьте пакеты nuget
- Autofac
- Интеграция Autofac asp.net mvc 5
- Autofac asp.net web api 2.x интеграция
в глобальном добавить в application_start (или как класс app_start) добавить вызов к классу ниже
AutofacConfig.RegisterAutoFac();
теперь добавьте этот класс в App_start
using System.Reflection;
using System.Web.Http;
using System.Web.Http.Controllers;
using System.Web.Mvc;
using Autofac;
using Autofac.Integration.Mvc;
using Autofac.Integration.WebApi;
namespace Example1.Web
{
public class AutofacConfig
{
public static IContainer RegisterAutoFac()
{
var builder = new ContainerBuilder();
AddMvcRegistrations(builder);
AddRegisterations(builder);
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
return container;
}
private static void AddMvcRegistrations(ContainerBuilder builder)
{
//mvc
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly());
builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
builder.RegisterModelBinderProvider();
//web api
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).PropertiesAutowired();
builder.RegisterModule<AutofacWebTypesModule>();
}
private static void AddRegisterations(ContainerBuilder builder)
{
//builder.RegisterModule(new MyCustomerWebAutoFacModule());
}
}
}
Теперь для каждой новой сборки, которую вы добавляете в проект, добавьте новый модуль, а затем зарегистрируйте модуль в функции AddRegisterations (пример указан)
Примечание
Я вернул контейнер, это не нужно.
Это сканирование текущей сборки для модулей, поэтому не добавляйте локальные модули в AddRegisterations, иначе вы будете регистрировать все дважды.
Ответ 3
Определенно разделить их. Autofac имеет ASP.NET MVC и ASP.NET Web API интегрирования. Это не всегда так, но если вам нужны одни и те же службы в обоих приложениях, скорее всего, что-то не так с архитектурой приложения.
Вот как вы можете сделать это с помощью ASP.NET Web API:
internal class AutofacWebAPI {
public static void Initialize(HttpConfiguration config) {
config.DependencyResolver = new AutofacWebApiDependencyResolver(
RegisterServices(new ContainerBuilder())
);
}
private static IContainer RegisterServices(ContainerBuilder builder) {
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).PropertiesAutowired();
//deal with your dependencies here
builder.RegisterType<CarsService>().As<ICarsService>();
builder.RegisterType<CarsCountService>().As<ICarsCountService>();
return builder.Build();
}
}
Затем зарегистрируйте это внутри Global.asax.cs, как показано ниже:
AutofacWebAPI.Initialize(GlobalConfiguration.Configuration);