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

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

安装 Autofac

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

要么在 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();}}

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

依赖注入有三种方式:

  • 构造函数注入

  • 接口注入

  • 属性注入

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

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

译文链接:https://www.infoworld.com/article/3397077/how-to-use-autofac-in-aspnet-core.html

如何在 ASP.Net Core 中使用 Autofac相关推荐

  1. 如何在 ASP.NET Core 中使用 HttpClientFactory ?

    ASP.Net Core 是一个开源的,跨平台的,轻量级模块化框架,可用它来构建高性能的Web程序,这篇文章我们将会讨论如何在 ASP.Net Core 中使用 HttpClientFactory. ...

  2. 如何在 ASP.Net Core 中使用 Lamar

    ASP.Net Core 自带了一个极简的 开箱即用 的依赖注入容器,实际上,你还可以使用第三方的 依赖注入容器 来替代它,依赖注入是一种设计模式,它能够有效的实现对象之间的解耦并有利于提高单元测试和 ...

  3. 如何在 ASP.Net Core 中使用 MediatR

    MediatR 是一个 中介者模式 的.NET开源实现, 中介者模式 管控了一组对象之间的相互通讯并有效的减少了对象之间错综复杂的相互依赖,在 中介者模式 中,一个对象不需要直接和另一个对象进行通讯, ...

  4. 如何在 ASP.Net Core 中对接 WCF

    在 REST API 出现之前,SOAP (Simple Object Access Protocol) 一直都是基于 web 的标准协议,虽然现在 REST 大行其道,但在平时开发中总会遇到对接第三 ...

  5. 如何在 ASP.Net Core 中使用 NCache

    虽然 ASP.Net Core 中缺少 Cache 对象,但它引入了三种不同的cache方式. 内存缓存 分布式缓存 Response缓存 Alachisoft 公司提供了一个开源项目 NCache, ...

  6. 如何在 ASP.Net Core 中使用 Configuration Provider

    ASP.NET Core 是一个开源的,跨平台的,精简的模块化框架,可用于构建高性能,可扩展的web应用程序, ASP.NET Core 中的数据配置常用 k-v 的形式存储,值得注意的是,新的数据配 ...

  7. 如何在 ASP.Net Core 中使用 Serilog

    记录日志的一个作用就是方便对应用程序进行跟踪和排错调查,在实际应用上都是引入 日志框架,但如果你的 日志文件 包含非结构化的数据,那么查询起来将是一个噩梦,所以需要在记录日志的时候采用结构化方式. 将 ...

  8. 如何在 ASP.NET Core 中使用 URL Rewriting 中间件

    URL rewriting 是根据预先配置好的一组规则去修改 request url,值得注意的是:URL Rewriting 的重写功能和 url 重定向 是两个概念,本篇我们就来讨论下如何在 AS ...

  9. 如何在 ASP.NET Core 中使用 Quartz.NET 执行任务调度

    当我们在web开发中,常常会遇到这么一个需求,在后台执行某一项具体的任务,具体的说就是这些任务必须在后台定时执行. Quartz.NET 是一个开源的 JAVA 移植版,它有着悠久的历史并且提供了强大 ...

最新文章

  1. Redfield.Sketch.Master中文版
  2. Discuz X3.1 论坛修改的方法(门户的修改)
  3. 6.Android的学习(Intent跳转页面,活动之间传递数据)
  4. python和c++无缝对接_总结:Python学习 和 Python与C/C++交互
  5. 对学习java的心得体会1
  6. android+获取图库图片+4.4,Android 从 Android 本地图库选择多个图片
  7. 关于U-Net结构的更浅显更易懂的解释
  8. ubuntu 安装 ftp server
  9. informix软件
  10. 查看opencv版本信息
  11. 【18年北京网络赛】Tomb Raider【递归求所有子序列】
  12. 服务器使用笔记本代理上网
  13. 1072 开学寄语 C++实现
  14. 微信公众号页面如何跳转至关注公众号页面
  15. Win7安装补丁KB2670838
  16. 大数据平台数据管控整体解决方案(48页PPT附下载)
  17. Python学习笔记——selenium无头模式
  18. 解决WARN: Establishing SSL connection without server‘s identity verification is not recommended警告问题~
  19. 韩漫ODDZ CITY上线一周获超高人气
  20. 致远OA ,限制附件上传格式或附件相关操作的方法(非正规操作,谨慎使用)

热门文章

  1. P1357 花园 (矩阵快速幂+ DP)
  2. 智能路由器-OpenWRT 系列四 (挂载移动设备)
  3. 双谷人才财务管理(序)
  4. LeetCode Implement Queue using Stacks (数据结构)
  5. ArrayBlockingQueue, LinkedBlockingQueue, ConcurrentLinkedQueue, RingBuffer
  6. Dom4J 解析xml ,类查询
  7. 为operamasks增加HTML扩展方式的组件调用
  8. Unity3D学习笔记之七创建自己的游戏场景
  9. div方框弯曲边样式_使用弯曲样式编辑文本
  10. mysql ldf文件太大_Linux_数据库清除日志文件(LDF文件过大),清除日志: 复制代码 代码如 - phpStudy...