今天来讲讲我对netcore中ioc的理解
注:下面所说的服务也指类,因为开发中常把service层的类说成服务,完全可以理解为一个类
概念
IOC(Inversion of Control)控制反转
传统应用程序由类内部主动创建依赖对象,也就是通过new
来生成,而IOC把创建对象的权利转交给IOC容器,查找依赖对象的权力也转交给IOC,由容器进行注入组合对象
服务定位器
服务定位器是指定对象类型,服务定位器直接生成。就是netcore中的GetService<>()
获取的对象
DI
DI是我只要声明对象类型,具体对象由框架自动生成。就是netcore中我们构造函数自动赋予的对象。
为什么使用IOC
使用new
方法构建的对象会产生高耦合,再代码更改时需要全部更改new
对象,容易漏改,工作量也很大
DI使用
总得来说就两步,一是注入服务,二是从IOC容器中获取服务
常规用法:
new serviceCollection()
,生成serviceCollection
对象serviceCollection
对象使用AddService()
方法添加对象类型- 服务中声明对象类型,在构造函数中赋值即可
服务定位器用法:
- 注入服务,如上1-2
serviceCollection
调用BuilderServiceProvider()
构建一个serviceProvider
从中获取对象serviceProvider
调用GetService<>()
获取对象
扩展方法
便于使用
serviceCollection
直接AddXX
生成对象,封装服务注入的过程
- 类修改为
static
类,AddXX
方法修改static
方法 - 方法中添加
this serviceCollection
参数
生命周期
生命周期是每个对象的生死时期,netcore中有3种生命周期,包括Transient,Scoped,Singleton
- Transient:每次获取该类型的对象都是重新构建的对象
- Scoped:在一个范围内是该类型对象是同一个对象,在Netcore中的范围就是一次请求
- Singleton:每次获取该对象都是同一个对象
注意
- 注入对象可以注入该类型也可以注入接口,推荐使用接口注入,面向接口编程
sp.GetRequiredService<ITestService>()
和sp.GetService<ITestService>()
的不同指出在于,前者没注入该类型会抛异常,建议使用sp.GetRequiredService<ITestService>()