如何在ASP.Net Core中使用Autofac

依赖注入可以有效的实现对象之间的 松耦合 并能够实现代码的可测试和可维护性,ASP.Net Core 提供了一个极简版的容器实现对 依赖注入 的原生支持,然而内置的依赖注入容器相比成熟的 依赖注入容器 太弱了。

为了解决这个问题,可以使用第三方的依赖注入容器,换句话说,你可以非常方便的使用 第三方容器 替换 原生容器, Autofac 就是这么一款优秀的依赖注入容器,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 Autofac。.

安装 Autofac

安装 Autofac 非常简单,要么通过 Nuget 可视化界面进行安装。

如何在ASP.Net Core中使用Autofac

 

要么在 NuGet Package Manager Console 命令行中输入如下命令。

Install-Package Autofac 
Install-Package Autofac.Extensions.DependencyInjection

创建注入类

为了能更好的解释依赖注入,考虑下面的 IAuthorRepository 接口,它包含了一个 GetMessage() 方法。

    public interface IAuthorRepository
    {
        string GetMessage();
    }

接下来创建一个实现 IAuthorRepository 接口的 AuthorRepository 子类,如下代码所示:

    public class AuthorRepository : IAuthorRepository
    {
        public string GetMessage()
        {
            return "Hello World";
        }
    }

哈哈,上面就是一个极简版的 仓储模式 ,目前还没有典型仓储模式有拥有的 CURD 方法,大家有兴趣可以补起来。

配置 Autofac

为了能够配置 Autofac,可以在 Startup.ConfigureServices() 方法中进行配置,大概分为以下两部分。

  • 创建 container 容器,将 service 注入到里面

可以使用 Autofac 框架提供的 Populate() 方法将 services 灌入到 container 中,如下代码所示:

    var containerBuilder = new ContainerBuilder();
            containerBuilder.Populate(services);

  • 将自定义的类注入到 Container 中

这个实现就简单了,通过 RegisterType() 方法将自定义的类注入到 Autofac 容器中,如下代码所示:

    containerBuilder.RegisterType<AuthorRepository>().As<IAuthorRepository>();

然后构建 container 容器,如下代码所示:

    var container = containerBuilder.Build();
    return container.Resolve<IServiceProvider>();

接下来是 ConfigureServices() 方法的完整代码,仅供参考。

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

            var containerBuilder = new ContainerBuilder();
            containerBuilder.Populate(services);

            containerBuilder.RegisterType<AuthorRepository>().As<IAuthorRepository>();

            var container = containerBuilder.Build();
            return container.Resolve<IServiceProvider>();
        }

在 Controller 中使用 Autofac

一切都配置好之后,接下来可以在 Controller 中实现注入,如下代码所示:

    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private IAuthorRepository _authorRepository;

        public ValuesController(IAuthorRepository authorRepository)
        {
            _authorRepository = authorRepository;
        }

        [HttpGet]
        public ActionResult<string> Get()
        {
            return _authorRepository.GetMessage();
        }
    }

如何在ASP.Net Core中使用Autofac

 

依赖注入 是 控制反转 的一种实现方法,它的一大特点在于在外部统一管理对象之间的依赖关系从而解除代码内部之间的依赖关系,正如 Autofac 这样的 IOC 容器利用了控制反转实现了对象的自动初始化和对象的生命周期管理。

依赖注入有三种方式:

  • 构造函数注入

  • 接口注入

  • 属性注入

显而易见,在本篇中我用的是 构造函数注入

我们已经看到了如何在 ASP.Net Core 中使用 Autofac 替换默认的 Container ,但我们不能仅仅停留在简单使用上,更多深度的用法我会在后面的文章中和大家一起聊。