是否可以配置Autofac以使用ASP.NET MVC和ASP.NET Web Api?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

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

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

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

提问于
用户回答回答于

当然可以将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

用户回答回答于

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

扫码关注云+社区