理解IOC/DI/IOC容器

下面的不要看,啥也不是:

biilbili视频

 

控制反转(IOC):
不需要你一个个的去New Class,
而是只需要你在服务中注入服务(交给容器去创建)

依赖注入(DI):
容器创建好后,再到你使用的时候,从容器把服务拿出来用的过程。
这个过程包含:属性注入,构造函数注入
当你使用IOC,程序启动的时候,这里是有2个过程:
1:Startup里,项目要用的服务注入进来:services.AddTransient<ITestServices, TestServiceTemp>();
1.1:插一句,这里在请求的时候,先是去的TestServicesTemp这个类的构造函数;走到下面的第二步的时候,啥都已经声明好了ok了
2:你发送请求的时候,在构造的时候,把你注入到容器中的服务拿过来处理逻辑,这就够了 private ITestServices _service; public TestController(ITestServices services) { _service = services; }

 

  

 那就再来说说三个生命周期: 

No1:Singleton "单个的,单一序列;单例模式"    
    //services.AddSingleton<ITestServices, TestServiceTemp>();
    //每次调用TestServiceTemp,都是同一个TestServiceTemp实例
    //只要这个程序跑起来,这个实例就这一个,不会创建新的实例
No2:Transient(短暂的;转瞬即逝的)
    //services.AddTransient<ITestServices, TestServiceTemp>();
    //这里每次调用TestServiceTemp,都是新创建一个TestServiceTemp实例
    //不管什么作用域啥的,每次请求都是会构造一个新的实例
    //实例的HashCode是不一样的
No3:Scoped(范围,作用域)
     services.AddScoped<ITestServices, TestServiceTemp>();
    //这里每次调用TestServiceTemp,都是新创建一个TestServiceTemp实例
    //但是要是在同一作用域内去请求 这两个Services的HashCode是一样的
我感觉Scope这个用的不多
注意:下面的_services 和tesrvices是两种注入方式 [Route(
"api/[controller]")] [ApiController] public class TestController : ControllerBase { private ITestServices _service; public TestController(ITestServices services) { _service = services; }// public Tuple<int, int> Get([FromServices]ITestServices tservices) { tservices.Add(); int before = _service.count; _service.Add(); int after = _service.count; return new Tuple<int, int>(before, after); } }

 

 

 
posted @ 2018-08-22 16:06  ProZkb  阅读(239)  评论(0编辑  收藏  举报