58 votes

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

Est-il possible de configurer Autofac pour qu’il fonctionne avec ASP .NET MVC et ASP .NET Web Api. Je suis conscient que les résolveurs de dépendance sont différents. Mais en utilisant 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?

94voto

Alex Meyer-Gleaves Points 1595

Il est certainement possible de configurer Autofac de travailler avec les deux MVC et Web API. Ce devrait être un scénario très commun. Il y a deux solveur de dépendances implémentations en raison MVC et Web API peuvent être utilisés indépendamment l'un de l'autre. La même chose s'applique pour l'Autofac intégrations.

Lors de l'utilisation de deux MVC et Web API dans la même application, chacun aura besoin de son propre résolveur de dépendance, même si elles peuvent être fournies 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 les enregistrements entre les deux, parce que l' InstancePerApiRequest et InstancePerHttpRequest de durée de vie des étendues partagent désormais la même balise.

Notez que le mécanisme de réglage de la résolution de dépendances pour les API Web et MVC est différent. Web API utilise GlobalConfiguration.Configuration.DependencyResolver et MVC utilise DependencyResolver.SetResolver.

14voto

Choco Smith Points 321

Je pensais ajouter un peu d'aide pour ceux qui luttent avec cette mvc5 et web api 2.

Tout d'abord ajouter les packages nuget

  • Autofac
  • Autofac asp.net mvc 5.1 intégration
  • Autofac asp.net l'api web 2.1 intégration

en complément global dans application_start (ou app_start classe) ajouter un appel à l'au-dessous de la classe AutofacConfig.RegisterAutoFac();

maintenant, ajoutez 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 nouvelle assemblée, vous ajoutez au projet ajouter un nouveau module, puis inscrire le module dans le AddRegisterations fonction (exemple donné)

Note: Je suis retourné le conteneur, ce n'est pas nessasary.

4voto

tugberk Points 16203

Certainement les séparer. Autofac a la fois ASP.NET MVC et ASP.NET l'API Web intégrations. Ce n'est pas toujours le cas, mais si vous avez besoin des mêmes services dans les deux demande de, très probablement il ya quelque chose de mal avec l'architecture de l'application.

Voici comment vous pouvez le faire avec ASP.NET l'API Web:

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

Alors, inscrivez-vous présent à l'intérieur de la Mondiale.asax.cs comme ci-dessous:

AutofacWebAPI.Initialize(GlobalConfiguration.Configuration);

1voto

amhed Points 1697

Voici un exemple utilisant Ninject, mais je pense que cela répond à votre question: http://haacked.com/archive/2012/03/11/itrsquos-the-little-things-about-asp-net-mvc-4.aspx

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X