asp.net core 内置DI容器的一点小理解
DI容器本质上是一个工厂,负责提供向它请求的类型的实例。
.net core内置了一个轻量级的DI容器,方便开发人员面向接口编程和依赖倒置(IOC)。
具体体现为Micorosoft.Extensions.DependencyInjection这个包。
.net core中内置的DI容器包含两大要素:ServiceCollection和ServiceProvider。
为了便于理解,我画了一张图:
通过上面的UML类图可以看出ServiceCollection其实就是一个集合,存放接口和实现的对应关系。这个集合的Item就是ServiceDescriptor类。ServiceDescriptor类有两个类型为Type的属性。一个代表接口类型,一个代表实现类的类型,形成对应关系。
ServicePorvider可以理解为具体服务的提供器。它是由ServiceCollection的扩展方法BuildServiceProvider创建的。我们需要什么服务,从提供器取就行了。通过上图可以看到ServicePorvider有个方法叫:GetService,这个方法会根据我们提供的接口从ServiceDescriptor集合中(ServiceCollection)中查找对应的实现类。当ServiceType和传入的接口类型一致后,再从匹配的ServiceDescriptor拿到ImplementationType实现类型,最后实例化该类型返回给我们。
上面获取实现类的描述,没有考虑ImplementationInstance和ImplementationFactory。更高大上的还是看大神的博客吧。
以下面的代码为例:
private readonly ILogger<HomeController> _logger; public HomeController(ILogger<HomeController> logger) { _logger = logger; }
我们知道ILogger<T>已经默认被注入到DI容器了。当程序创建HomeController类时,首先会通过构造方法检测到它依赖Ilogger<HomeController>接口,这个时候我们的DI容器就会查找与这个接口对应的实现类,并自动创建这个实现类的实例。
转载于:https://www.cnblogs.com/subendong/p/8963840.html
- 点赞
- 收藏
- 分享
- 文章举报
- Asp.Net Core 2.0 之旅---AutoFac IOC容器的使用教程
- 对 ASP.NET 控件的一点理解(整理)
- ASP.NET中RouteValueDictionary的一点理解
- 通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流程[上]:采用管道处理请求
- 对 ASP.NET 控件的一点理解(整理)
- 丙申年把真假美猴王囚禁在容器中跑 ASP.NET Core 1.0
- Docker容器环境下ASP.NET Core Web API应用程序的调试
- ASP.NET Core 借助 K8S 玩转容器编排
- 在Asp.Net Core中使用DI的方式使用Hangfire构建后台执行脚本
- 理解ASP.NET Core 依赖注入
- Linux中以单容器部署Nginx+ASP.NET Core
- ASP.NET Core开发-获取所有注入(DI)服务
- Docker & ASP.NET Core (1):把代码连接到容器
- Docker容器运行ASP.NET Core的实现步骤
- Linux中以单容器部署Nginx+ASP.NET Core
- 用Scrutor来简化ASP.NET Core的DI注册
- ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)
- 2.ASP.NET Core Docker学习-镜像容器与仓库
- kubernetes高级之创建只读文件系统以及只读asp.net core容器
- ASP.NET Core 2.1 : 十二.内置日志、使用Nlog将日志输出到文件