是否有可能configurationAutofac使用ASP.NET MVC和ASP.NET Web Api

是否可以configurationAutofac使用ASP .NET MVC和ASP .NET Web Api。 我知道依赖parsing器是不同的。 但是当使用logging的方法时,我只能设置一个全局parsing器。

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

这个方法不好吗? 我应该将我的解决scheme分成两个项目,并分别处理每个dependency injection?

当然也可以configurationAutofac来同时使用MVC和Web API。 预计这是一个非常普遍的情况。 有两个独立的依赖parsing器实现,因为MVC和Web API可以独立使用。 这同样适用于Autofac集成。

在同一个应用程序中同时使用MVC和Web API时,每个需要自己的依赖关系parsing器,尽pipe它们可以提供相同的容器实例。

 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设置依赖关系parsing器的机制是不同的。 Web API使用GlobalConfiguration.Configuration.DependencyResolver ,MVC使用DependencyResolver.SetResolver

我想我会添加一些帮助,这些在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中添加本地模块,否则您将注册一切两次。

绝对分开他们。 Autofac拥有ASP.NET MVC和ASP.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);