【问题标题】:Is it possible to configure Autofac to work with ASP.NET MVC and ASP.NET Web Api是否可以将 Autofac 配置为与 ASP.NET MVC 和 ASP.NET Web Api 一起使用
【发布时间】:2012-07-14 03:43:38
【问题描述】:

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

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

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

【问题讨论】:

标签: asp.net-mvc asp.net-web-api autofac


【解决方案1】:

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

【讨论】:

  • 很好的答案。唯一的一点是关于“因为 MVC 和 Web API 可以相互独立地使用。”。我认为 autofac 有两个分别用于 mvc 和 webapi 的插件,因为两者有不同的运行时。
  • WebApi 不使用 GlobalConfiguration,而是使用 HttpConfiguration,在基于 owin 的项目的情况下可以简单地实例化和使用:config.DependencyResolver = new AutofacWebApiDependencyResolver(...)
【解决方案2】:

我想我会为那些在 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 中添加本地模块,否则您将注册所有内容两次。

【讨论】:

  • 谢谢。终于有人在这里简单地阐述了它,这是一种易于理解的方式,无需强加意见等。
【解决方案3】:

绝对将它们分开。 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);

【讨论】:

  • 确实如此。最好将前端和服务配置分离在同一个项目中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 2014-10-29
相关资源
最近更新 更多