2012-07-14 35 views
51

是否可以将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; 

这种方法不好主意?我应该将解决方案分成两个项目并分别处理每个项目的依赖项注入吗?

+0

我在这里有一个最小的实现:http://byterot.blogspot.co.uk/2012/04/aspnet-web-api-series-part-4-dependency.html – Aliostad 2012-07-14 16:49:37

回答

82

这当然是可能的配置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); 

也可以分享两人之间因为InstancePerApiRequestInstancePerHttpRequest寿命范围现在共享相同的标记注册。

请注意,设置Web API和MVC的依赖关系解析器的机制不同。 Web API使用GlobalConfiguration.Configuration.DependencyResolver,而MVC使用DependencyResolver.SetResolver

+0

很好的答案。唯一的事情是关于“因为MVC和Web API可以彼此独立使用”。我认为autofac针对mvc和webapi分别有两个插件,因为它们有不同的运行时间。 – anIBMer 2013-06-17 05:17:35

+0

WebApi并不使用'GlobalConfiguration',而是使用'HttpConfiguration',在基于owin的项目中可以简单地实例化和使用:'config.DependencyResolver = new AutofacWebApiDependencyResolver(...)'。 – 2016-04-26 15:49:34

4

绝对将它们分开。 Autofac同时具有ASP.NET MVCASP.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); 
+1

的确如此。最好在同一个项目中分离前端和服务配置。 – 2014-11-01 12:48:05

11

我以为我想补充一点帮助那些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中添加本地模块,否则您将注册一切两次。

+1

谢谢。最后,有人只是在这里展示我简单易懂的一种方式,而不会强加任何意见等。 – punkologist 2015-03-23 21:35:04