说起 IoC 和 DI, 使用过 ASP.NET Core 的人对这两个概念一定不陌生, 早前, 自己也有尝试过去了解这两个东西, 但是一直觉得有点很难去理解, 总觉得对其还是模糊不清, 所以, 趁着今天有空, 就去把两个概念捋清楚, 并将学习过程的知识点记录下来.
一, IoC 和 DI 的理解
1.1 什么是 IoC?
IoC-Inversion of Control, 即控制反转, 其是一种设计思想, 而不是一种技术. 再没有使用 IoC 之前, 我们一般是通过 new 来实例化, 从而创建一个对象. 但是我们使用 IoC 之后, 创建这个对象的控制权将由内部转换到外部, 那么这个过程便可以理解为控制反转.
1.2 什么是 DI(依赖注入)?
全称为 Dependency Injection, 意思自身对象中的内置对象是通过注入的方式进行创建. 形象的说, 即由容器动态的将某个依赖关系注入到组件之中.
1.3 IoC 和 DI 的联系?
IoC 是一种设计思想, 而 DI 是这种设计思想的一个实现. 理解 IoC 和 DI 的关键是:"谁依赖谁, 为什么需要依赖, 谁注入谁, 注入了什么".
●谁依赖于谁: 当然是应用程序依赖于 IoC 容器;
●为什么需要依赖: 应用程序需要 IoC 容器来提供对象需要的外部资源;
●谁注入谁: 很明显是 IoC 容器注入应用程序某个对象, 应用程序依赖的对象;
●注入了什么: 就是注入某个对象所需要的外部资源 (包括对象, 资源, 常量数据)
1.4 为啥需要反转?
为了在业务变化的时候尽量减少改动代码造成的问题.
1.5 使用 DI 的好处?
1) 让程序之间松散耦合, 减少依赖, 有利于功能复用.
2) 让程序整体结构更加灵活, 有利于单元测试.
1.6 常见的 IoC 框架.
微软自带 DI,Autofac,Unity
二,.NET Core 自身 DI 使用
2.1.NET Core 自身 DI
ASP.NET Core 本身已经集成了一个轻量级的 IoC 容器, 开发者只需要定义好接口后, 在 Startup.cs 的 ConfigureServices 方法里使用对应生命周期的绑定方法即可, 常见方法如下
在 start.up 类中 ConfigureServices 方法对实例进行注册
- services.AddTransient<IApplicationService,ApplicationService>();
- services.AddSingleton<IApplicationService,ApplicationService>();
- services.AddScoped<IApplicationService,ApplicationService>();
这三个方法都是将我们实例注册进去, 只不过是生命周期不一样.
AddSingleton: 整个应用程序生命周期以内只创建一个实例, 相当于一个静态类.
AddScoped: 在同一个 Scope 内只初始化一个实例 , 可以理解为 ( 每一个 request 级别只创建一个实例, 同一个 http request 会在一个 scope 内).
AddTransient: 每一次都会创建一个新的实例.
2.2 Demo 应用
1) 首先定义好一个 IUserService 接口, 然后实现该接口
2) 在 startup.cs 类中 ConfigureServices 方法中添加下面代码
3) 通过构造函数来注入
4) 运行, 查看结果
三, 采用 Autofac 替换 IoC 容器
Autofac 是一款轻量级的 IoC 框架, 目前和 ASP.NET Core 结合的非常好, 官方网站 http://autofac.org, 源码下载地址 https://github.com/autofac/Autofac.
1) 在 Nuget 中引入两个: Autofac.Extras.DynamicProxy(Autofac 的动态代理, 它依赖 Autofac, 所以可以不用单独引入 Autofac),Autofac.Extensions.DependencyInjection(Autofac 的扩展)
2) 在 startup.cs 类中 ConfigureServices 方法中添加以下代码:(注意: 把返回值类型改为 IServiceProvider)
- var builder = new ContainerBuilder();// 实例化 Autofac 容器
- builder.RegisterType<UserService>().As<IUserService>();// 注册要通过反射创建的组件
- builder.Populate(services);
- var ApplicationContainer = builder.Build();
- return new AutofacServiceProvider(ApplicationContainer);// 第三方 IoC 接管
3) 同样也是通过构造函数进行注入
4) 运行, 查看结果
四, 总结
本篇文章, 主要是讲了 IoC 和 DI 的关系, 以及通过微软自带的 IoC 框架和 Autofac 实现在 ASP.NET Core 中进行简单注入, 其最大的优点就是实现了解耦的作用. 同样, 本篇文章也是为了记录自己学习的过程, 后续有时间将会继续深入研究关于 Autofac 的内容.
好文参考: https://www.cnblogs.com/laozhang-is-phi/p/9541414.html(老张的哲学)
来源: https://www.cnblogs.com/Erhao/p/11118642.html