2012-07-14 18 views
51

? Es posible configurar Autofac para que funcione con ASP .NET MVC y ASP .NET Web Api. Soy consciente de que los resolvedores de dependencia son diferentes. Pero cuando uso los enfoques documentados, solo puedo establecer un resolvedor global.¿Es posible configurar Autofac para que funcione con ASP.NET MVC y ASP.NET Web Api

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

¿Este enfoque es una mala idea? ¿Debo separar mi solución en dos proyectos y manejar la inyección de dependencia para cada uno individualmente?

+0

Tengo una implementación mínima aquí: http://byterot.blogspot.co.uk/2012/04/aspnet-web-api-series-part-4-dependency.html – Aliostad

Respuesta

82

es ciertamente posible para configurar Autofac para que funcione tanto con MVC como con la API web. Se espera que este sea un escenario muy común. Hay dos implementaciones separadas de resolución de dependencias porque MVC y Web API se pueden usar de forma independiente. Lo mismo aplica para las integraciones de Autofac.

Al utilizar tanto MVC como la API web en la misma aplicación, cada uno requerirá su propia resolución de dependencias, aunque se les puede proporcionar la misma instancia del contenedor.

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

También es posible compartir registros entre los dos, porque los alcances InstancePerApiRequest y InstancePerHttpRequest de toda la vida ahora comparten la misma etiqueta.

Tenga en cuenta que el mecanismo para establecer la resolución de dependencias para Web API y MVC es diferente. Web API usa GlobalConfiguration.Configuration.DependencyResolver y MVC usa DependencyResolver.SetResolver.

+0

Gran respuesta. Lo único es "porque MVC y Web API se pueden usar de forma independiente". Calculo autofac tiene dos plugins para MVC y WebAPI por separado porque los dos tienen diferente tiempo de ejecución. – anIBMer

+0

WebAPI no utiliza 'GlobalConfiguration' por decir, sino que utiliza' HttpConfiguration' que en el caso de los proyectos basados ​​en Owin puede ser simplemente una instancia y se utiliza de esta manera: 'config.DependencyResolver = new AutofacWebApiDependencyResolver (...)'. –

4

Definitivamente separarlos. Autofac tiene integraciones ASP.NET MVC y ASP.NET Web API integradas. Este no es siempre el caso, pero si necesita los mismos servicios en ambas aplicaciones, lo más probable es que haya algún problema con la arquitectura de la aplicación.

Aquí es cómo se puede hacer esto con la 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(); 
    } 
} 

A continuación, registre esta dentro de la Global.asax.cs de la siguiente manera:

AutofacWebAPI.Initialize(GlobalConfiguration.Configuration); 
+1

Eso es cierto. Es mejor separar la interfaz y la configuración de servicios en el mismo proyecto. –

11

pensé que me gustaría añadir un poco de ayuda a aquellos que luchan con esto en mvc5 y la API de Web 2.

primero Añadir paquetes NuGet

  • Autofac
  • Autofac asp.net mvc 5 integración
  • Autofac asp.net web api 2.x integración

en complemento global en Application_Start (o como app_start clase) añadir llamada a la clase de abajo

AutofacConfig.RegisterAutoFac(); 

ahora añadir esta clase bajo 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()); 
     } 
    } 
} 

A partir de ahora para cada nuevo el montaje se agrega al proyecto de añadir un nuevo módulo y luego se registra en el módulo de la función AddRegisterations (ejemplo dado)

Nota:

Devolví el contenedor, esto no es necesario.

Este escanea el conjunto actual de los módulos así que no añadir módulos locales en AddRegisterations de lo contrario se registrará todo dos veces.

+1

gracias. Finalmente, alguien que lo establece aquí es simple y fácil de entender sin imponer opiniones, etc. – punkologist

Cuestiones relacionadas