理解IOC/DI/IOC容器
下面的不要看,啥也不是:
控制反转(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); } }
人各有命,上天注定,有人天生为王,有人落草为寇。脚下的路,如果不是你自己的选择,那么旅程的终点在哪,也没人知道。你会走到哪,会遇到谁,都不一定。