依赖注入可以有效的实现对象之间的松耦合
并能够实现代码的可测试和可维护性, Core 提供了一个极简版的容器实现对依赖注入
的原生支持,然而内置的依赖注入容器相比成熟的依赖注入容器
太弱了。
为了解决这个问题,可以使用第三方的依赖注入容器,换句话说,你可以非常方便的使用第三方容器
替换原生容器
, Autofac 就是这么一款优秀的依赖注入容器,这篇文章我们将会讨论如何在 Core 中使用 Autofac。
安装 Autofac
安装 Autofac 非常简单,要么通过 Nuget 可视化界面进行安装。
要么在 NuGet Package Manager Console 命令行中输入如下命令。
Install-PackageAutofacInstall-PackageAutofac.Extensions.DependencyInjection
创建注入类
为了能更好的解释依赖注入,考虑下面的IAuthorRepository
接口,它包含了一个GetMessage()
方法。
publicinterfaceIAuthorRepository{stringGetMessage();}
接下来创建一个实现 IAuthorRepository 接口的 AuthorRepository 子类,如下代码所示:
publicclassAuthorRepository:IAuthorRepository{publicstringGetMessage(){return"HelloWorld";}}
哈哈,上面就是一个极简版的仓储模式
,目前还没有典型仓储模式有拥有的 CURD 方法,大家有兴趣可以补起来。
配置 Autofac
为了能够配置 Autofac,可以在Startup.ConfigureServices()
方法中进行配置,大概分为以下两部分。
创建 container 容器,将 service 注入到里面
可以使用 Autofac 框架提供的Populate()
方法将 services 灌入到 container 中,如下代码所示:
varcontainerBuilder=newContainerBuilder();containerBuilder.Populate(services);
将自定义的类注入到 Container 中
这个实现就简单了,通过RegisterType()
方法将自定义的类注入到 Autofac 容器中,如下代码所示:
containerBuilder.RegisterType<AuthorRepository>().As<IAuthorRepository>();
然后构建 container 容器,如下代码所示:
varcontainer=containerBuilder.Build();returncontainer.Resolve<IServiceProvider>();
接下来是ConfigureServices()
方法的完整代码,仅供参考。
publicIServiceProviderConfigureServices(IServiceCollectionservices){services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);varcontainerBuilder=newContainerBuilder();containerBuilder.Populate(services);containerBuilder.RegisterType<AuthorRepository>().As<IAuthorRepository>();varcontainer=containerBuilder.Build();returncontainer.Resolve<IServiceProvider>();}
在 Controller 中使用 Autofac
一切都配置好之后,接下来可以在 Controller 中实现注入,如下代码所示:
[Route("api/[controller]")][ApiController]publicclassValuesController:ControllerBase{privateIAuthorRepository_authorRepository;publicValuesController(IAuthorRepositoryauthorRepository){_authorRepository=authorRepository;}[HttpGet]publicActionResult<string>Get(){return_authorRepository.GetMessage();}}
依赖注入 是 控制反转 的一种实现方法,它的一大特点在于在外部统一管理对象之间的依赖关系从而解除代码内部之间的依赖关系,正如 Autofac 这样的 IOC 容器利用了控制反转实现了对象的自动初始化和对象的生命周期管理。
依赖注入有三种方式:
构造函数注入
接口注入
属性注入
显而易见,在本篇中我用的是构造函数注入
。
我们已经看到了如何在 Core 中使用 Autofac 替换默认的 Container ,但我们不能仅仅停留在简单使用上,更多深度的用法我会在后面的文章中和大家一起聊。
译文链接:/article/3397077/how-to-use-autofac-in-aspnet-core.html