2012-07-14 104 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