14、ioc+di
ioc:Inversion of Control 控制反转
大家都翻译成【控制反转】,但是有些东西翻译成中文就变了味道,在我的理解,Inversion of Control 这个词应该理解成【控制委托】
di:Dependency Injection 依赖注入
依赖注入是Ioc的实现,不多说,完后看
举个栗子,小明衣服脏了,要自己洗衣服,然后按照小明洗衣服的流程,先打开洗衣机,扔进去衣服,开洗,然后等待衣服洗完把衣服拿出来,等到干净的衣服。有一天小明觉得,这个事儿不应该我来做,我只需要有洗衣服这个想法,还有最后获得干净的衣服,怎么洗我不想管,于是小明找了个管家,小明把洗衣服这个事儿就交给管家了,每次小明想洗衣服的时候,就大喊一声,我要洗衣服,然后管家就来了,他把衣服送到干洗店,有时候手洗,有时候不洗,然后把衣服交到小明手里,说衣服洗好了。这个过程从原来洗衣服由小明一手操控,到把实现交给管家只关心结果,就是我对Ioc的理解。下面进行角色分解:
小明:业务调用者,可以是controller,service
洗衣服:需要用到的服务方法
管家:Ioc容器
请管家:向Ioc容器加入洗衣服服务
大喊洗衣服:从Ioc容器类型解析,获取洗衣服服务
管家洗衣服:执行服务
回头看上面的两个概念,di是ioc的一种实现,为什么这么说,小明由原来的自己洗衣服,变成交给别人洗,就是ioc的概念(不太贴切,但是概念这种东西,可意会不可言传),他怎么实现的呢?就是找了个大管家,告诉他我需要你,帮我洗衣服,就是di
下面用代码来演示一下,加深印象(.net core 3.1)
创建控制台应用,代码如下
using Microsoft.Extensions.DependencyInjection; using System; namespace Ares.Ioc { class Program { static void Main(string[] args) { // 非Ioc实现 IPerson person = new XiaoMing(); person.WashClothes("小明自己洗衣服"); // Ioc实现 var serviceCollection = new ServiceCollection(); serviceCollection.AddTransient<IPerson, XiaoMing>(); var serviceProvider = serviceCollection.BuildServiceProvider(); using (var scope = serviceProvider.CreateScope()) { scope.ServiceProvider.GetService<IPerson>().WashClothes("管家洗衣服"); scope.ServiceProvider.GetService<IPerson>().WashClothes("管家洗衣服"); } using (var scope = serviceProvider.CreateScope()) { scope.ServiceProvider.GetService<IPerson>().WashClothes("管家洗衣服"); scope.ServiceProvider.GetService<IPerson>().WashClothes("管家洗衣服"); } } } public interface IPerson { void WashClothes(string washType); } public class XiaoMing : IPerson { public void WashClothes(string washType) { Console.WriteLine(washType + this.GetHashCode()); } } }
.net core 依赖注入的简单实现
然后看一下 AddTransient AddSingleton AddScoped 这三种方法的生命周期
AddSingleton 运行结果 ,hashcode没有变化,也就是全生命周期,都是一样的
AddScoped 运行结果 同生命周期内没变化
AddTransient 运行结果,全都变了,也就是调用一次实例化一次