IOC 和DI

项目地址:gitee

一.控制反转和依赖注入概念

案例:
1.去餐厅吃饭时,找个位置坐了下来,服务员拿着菜单向你走来,这时是你要吃饭,但是你不主动找服务员,是服务员找你,服务员主动为你服务
2.你在家,你想喝奶茶,我用手机下单,去购买奶茶,也是别人送上门
这时,本来是你主动找他的事情,但是却变成了别人主动找你,这就是控制反转(DI)
3.回到代码中,本身是你要去new一个对象,去用这个对象里面的方法,但是现在变过来了,不需要你主动找,在你这个类没有真正运行方法的时候,
他就把服务送上门来了(程序启动的时候,服务已经被注入了),我没有去请求他,但是系统主动把服务给我了,通过构造函数注入,让服务注入进来,
有了服务对象,这就是控制反转,依赖注入(IOC)是控制反转(DI)的一种手段或者方式

作用

  • 谁依赖于谁:应用程序依赖于IOC容器
  • 为什么需要依赖:应用程序需要IOC容器来提供对象需要的外部资源
  • 谁注入谁:IOC容器注入应用程序某个对象,应用程序依赖的对象
  • 注入了什么:就是注入某个对象所需要的外部资源(包括对象,资源,常量数据等)

IOC容器是什么

在ASP NET CORE 6中的IOC容器就是ServiceCollection,从字面意思理解就是服务收集器或者叫服务集合。它就是存放服务的容器罐子而已,而这里所谓的服务就是指开发中需要的各种类的统称。

服务生命周期

服务生命周期分三类:

  • Transint 瞬时生命周期(注入的服务,相当于调用完成之后就释放,下一次调用还是新的服务,相当于不会保存服务,每次请求都会重新实例生成新的服务)
  • Singleton 单例生命周期(注入的服务从创建开始就一直存在,直到应用程序关闭,才会再次创建新的服务,相当于静态缓存static变量)
  • Scoped 作用域生命周期(注入的服务是相当于普通变量,如果第一次请求了,则会保存服务,应用程序不关闭的状态下,如果下一次发起请求,还需要再次获取服务,保存服务,除去第一次请求之后,剩下都是单例)
    作用域并不是除了第一次请求外,其余都是单例注入,而是如果作用域生成的服务,不被使用,一段时间之后就会被垃圾回收机制GC轮询处理,被回收掉

注入方式的区别

builder.Services.AddTransient();
builder.Services.AddTransient(typeof(Service));
这种写法是为了方便注入泛型,如果要注入的服务是个泛型,那么上面那个方法没有办法注入泛型,但是下面那个方法是可以的,
对于多个仓储类,为了避免一次次的去注入,我们就需要用到空泛型去注册,然后到每个构造函数中再去写具体的注入类型,perry NB
单例注入的特殊方式:
builder.Services.AddSingleton(new Service());
这样写可以,在我程序启动的时候,直接将服务注入,而不用再次注入,创建实例。
其他的注入方式为什么不可以这么做?是因为其他的注入方式在程序启动的时候都需要先去实例一次服务,所以即便程序启动的时候,将字段或者属性赋值也没用,没意义的

重点

依赖注入时,每个类里注入的服务,它都会依次注入,先从最底层开始注入,就是最深层注入,然后依次向上注入,最后到我们的构造函数。
每个要注入的服务中,又引用了其他的服务,它会依次向下找,找到最底层的注入的服务,开始依次往上注入

autofac的使用

1.在注入服务之前,将容器替换为autofac容器
先安装nuget包,Autofac.Extensions.DependencyInjection
然后再将原生容器替换成autofac容器,(这行代码最好写在builder上面,写在注入服务下面,为防止bug的出现)
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
替换成autofac容器之后,你所有注入的服务都会在autofac容器中

posted @ 2022-03-03 20:36  rookiexwang  阅读(47)  评论(0编辑  收藏  举报