Можно ли настроить Autofac для работы с ASP.NET MVC и web ASP.NET API-интерфейс



можно ли настроить Autofac для работы с ASP .NET MVC и ASP .NET Web Api. Я знаю, что решатели зависимостей разные. Но при использовании документированных подходов я могу установить только один глобальный решатель.



// Set the dependency resolver implementation.
GlobalConfiguration.Configuration.DependencyResolver = resolver;


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

585   3  

3 ответов:

конечно, можно настроить 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.

Я думал, что добавлю немного помощи тем, кто борется с этим в 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, иначе вы зарегистрируете все дважды.

определенно разделите их. 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();
    }
}

затем зарегистрируйте это внутри глобального.асакс.CS, как показано ниже:

AutofacWebAPI.Initialize(GlobalConfiguration.Configuration);

Comments

    Ничего не найдено.