1、 理解ServiceCollection以前先要熟悉几个概念:DIP、IOC、DI、Ioc容器;mvc
2、 接下来先简单说一下几个概念问题:框架
一、DIP(依赖倒置原则):六大设计原则里面一种设计原则,它转换了依赖关系,高层模块不依赖于底层模块的实现,而低层模块要依赖于高层模块的接口定义,总的原则就是高层和底层都不互相依赖,二者都依赖与抽象,抽象不依赖于实现,实现应该依赖于抽象
asp.net
二、IOC(控制反转):一种反转流、依赖和接口的方式(DIP的具体实现方式)ide
三、DI(依赖注入):IoC的一种实现方式,用来反转依赖(IoC的具体实现方式)
ui
四、IoC容器:依赖注入的框架,用来映射依赖,管理对象建立和生存周期(DI框架)。this
4. 一、IOC思想就是把类当作组件或服务来看待,组件内必定要高内聚,组件之间必定要低耦合,既然要保持低耦合,那就必定不要轻易的去new什么对象。组件之间的交互最好的方式就是把new的操做交给第三方的IOC治理框架去作。 spa
4.二、IOC容器能作到哪些.net
√对接口和实现类实现了由原来的零散式管理到如今的集中化管理设计
√ 对类之间,类接口之间的关联关系能够采用多种模式注入(构造器注入,属性注入)等等。code
√ 对实现类的生命周期进行了统一管理,可以控制服务的建立,释放和监控。
√ 类的依赖由编译时推迟到了运行时。
4.三、微软从新设计的asp.net core 就是基于内建容器ServiceCollection,其实就一个IOC容器,在asp.net core出来以前也有好几种IOC容器如:Autofac、Unity等等
3、 ServiceCollection具体实现(如下程序在控制台演示)
3.一、先建立控制台程序 ,从nuget下载Microsoft.Extensions.DependencyInjection引用
先建立Ibird,再建立Sparrow实现Ibird接口
public interface Ibird { void Fly(); }
public class Sparrow : Ibird { public string Name { get; set; } ="麻雀"; public Sparrow() { Console.WriteLine("正在建立对象。。。。。。"); } public void Fly() { Console.WriteLine($"{this.Name}飞来了!!!"); } }
3.二、ServiceCollection注入生命周期(single,scoped,transient)
3.2 .一、Transient:每次从容器 (IServiceProvider)中获取的时候都是一个新的实例
//IOC容器 ServiceCollection services = new ServiceCollection(); //注册服务 Transient注入方法 services.AddTransient<Ibird, Sparrow>(); var provider = services.BuildServiceProvider(); //从IOC容器取Ibird实例对象 var sparrow1 = provider.GetService<Ibird>(); //再一次从IOC容器取Ibird实例对象 var sparrow2 = provider.GetService<Ibird>(); Console.WriteLine("经过Transient注入的对象,每次取对象是否同一个:"+sparrow1.Equals(sparrow2));
运行结果:对象被建立了2次,两个对象不一样
3.2 .二、Singleton:每次从同根容器中( IServiceProvider)获取的时候都是同一个实例
//IOC容器 ServiceCollection services = new ServiceCollection(); //注册服务 Singleton services.AddSingleton<Ibird, Sparrow>(); var provider = services.BuildServiceProvider(); //从IOC容器取Ibird实例对象 var sparrow1 = provider.GetService<Ibird>(); //再一次从IOC容器取Ibird实例对象 var sparrow2 = provider.GetService<Ibird>(); Console.WriteLine("经过Transient注入的对象,每次取对象是否同一个:"+sparrow1.Equals(sparrow2));
运行结果:对象被建立了1次,两个对象相同
3.2 .三、Scoped:同一个请求中从同一个容器中( IServiceProvider)获取的实例是相同的实例
控制台很差模拟同一个请求多个对象建立生成,能够在asp .net core mvc试试,结果同一个请求中获取实例是同样的,不一样请求中获取实例不同