web-dev-qa-db-fra.com

Est-il possible de configurer Autofac pour fonctionner avec ASP.NET MVC et ASP.NET Web Api

Est-il possible de configurer Autofac pour fonctionner avec ASP .NET MVC et ASP .NET Web Api. Je suis conscient que les résolveurs de dépendances sont différents. Mais lorsque j'utilise les approches documentées, je ne peux définir qu'un seul résolveur global.

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

Cette approche est-elle une mauvaise idée? Dois-je séparer ma solution en deux projets et gérer l'injection de dépendance pour chacun individuellement?

58
Raúl Roa

Il est certainement possible de configurer Autofac pour fonctionner avec MVC et API Web. Cela devrait être un scénario très courant. Il existe deux implémentations de résolveur de dépendances distinctes car MVC et l'API Web peuvent être utilisés indépendamment l'un de l'autre. Il en va de même pour les intégrations Autofac.

Lors de l'utilisation de MVC et de l'API Web dans la même application, chacun aura besoin de son propre résolveur de dépendances, bien qu'ils puissent être fournis avec la même instance du conteneur.

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);

Il est également possible de partager des enregistrements entre les deux, car les étendues de durée de vie InstancePerApiRequest et InstancePerHttpRequest partagent désormais la même balise.

Notez que le mécanisme de définition du résolveur de dépendances pour l'API Web et MVC est différent. L'API Web utilise GlobalConfiguration.Configuration.DependencyResolver et MVC utilise DependencyResolver.SetResolver.

92
Alex Meyer-Gleaves

Je pensais que j'ajouterais un peu d'aide à ceux qui luttent avec cela dans mvc5 et web api 2.

Ajoutez d'abord des paquets de pépites

  • Autofac
  • Intégration Autofac asp.net mvc 5
  • Intégration de l'API Web 2.x d'Autofac asp.net

dans global ajouter dans application_start (ou en tant que classe app_start) ajouter un appel à la classe ci-dessous

AutofacConfig.RegisterAutoFac();

ajoutez maintenant cette classe sous 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());
        }
    }
}

À partir de maintenant, pour chaque nouvel assemblage que vous ajoutez au projet, ajoutez un nouveau module, puis enregistrez le module dans la fonction AddRegisterations (exemple donné)

Remarque:

J'ai retourné le conteneur, ce n'est pas nécessaire.

Cela scanne l'assembly actuel pour les modules donc n'ajoutez pas de modules locaux dans AddRegisterations sinon vous enregistrerez tout deux fois.

14
Choco Smith

Séparez-les définitivement. Autofac possède à la fois ASP.NET MVC et ASP.NET Web API intégrations. Ce n'est pas toujours le cas mais si vous avez besoin des mêmes services dans les deux applications, il y a très probablement un problème avec l'architecture de l'application.

Voici comment procéder avec l'API Web ASP.NET:

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();
    }
}

Ensuite, enregistrez-le dans le Global.asax.cs comme ci-dessous:

AutofacWebAPI.Initialize(GlobalConfiguration.Configuration);
4
tugberk