Подтвердить что ты не робот

Можно ли настроить 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;

Является ли этот подход плохими идеями? Должен ли я отделить свое решение от двух проектов и обрабатывать инъекцию зависимостей для каждого отдельно?

4b9b3361

Ответ 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);