2021-06-07

Net5学习笔记

IOC 容器IServiceCollection

什么是Ioc
把对象的统一创建交给第三方容器来创建

如何使用内置IOC ServerCollection

1.在Starup中的ConfigurServicetion方法中注册服务

services.AddSingleton<ITestServiceA, TestServiceA>();--------------- private readonly IServiceProvider _ServiceProvider = null; ITestServiceA testServiceA = (ITestServiceA)_ServiceProvider.GetService(typeof(ITestServiceA));   testServiceA.Show();

2.在使用的控制器中,通过构造函数,定义服务的抽象类型,作为参数,在运行时,得到具体的服务

3.调用服务内的方法

(视图中可以使用@inject获取实列)

DI依赖注入:IServerConcetion支持构造函数注入

什么是依赖注入
如果对象a依赖对象b,对象b依赖对象c,就可以了先构造对象c传递给对象b,然后把b传递给a

IServer可以支持无限级层的依赖注入;前提是都要先注入服务(注册抽象和集体的映射关系)

IserverCollention生命周期

那么再创建对象的时候,不同情况,不需要让对象单列,每一次都创建新的对象实列;不同的作用于新的实例

瞬时生命周期:AddTransient 每一次getService获取的实例都是不同的实例(项目中更多的使用)

单例生命周期:AddSingleton单例生命周期,在整个进程中获取的都是同一个实例

作用域生命周期:AddScoped 同一个作用域,获取的是同一个对象的实例;不同的作用域,获取的是不同的对象实例

#region IServiceCollection生命周期解析   //瞬时生命周期   {    //IServiceCollection serviceCollection = new ServiceCollection();    //serviceCollection.AddTransient<ITestServiceA, TestServiceA>(); //瞬时生命周期,每一次getService获取的实例都是不同的实例    //ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();    //ITestServiceA testServiceA = serviceProvider.GetService<ITestServiceA>();    //ITestServiceA testServiceA1 = serviceProvider.GetService<ITestServiceA>();    //bool isOK = object.ReferenceEquals(testServiceA, testServiceA1); //结果为false; 两次获取的对象不是同一个实例   }   //单例生命周期   {    //IServiceCollection serviceCollection = new ServiceCollection();    //serviceCollection.AddSingleton<ITestServiceA, TestServiceA>(); //单例生命周期,在整个进程中获取的都是同一个实例    //ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();    //ITestServiceA testServiceA = serviceProvider.GetService<ITestServiceA>();    //ITestServiceA testServiceA1 = serviceProvider.GetService<ITestServiceA>();    //bool isOK = object.ReferenceEquals(testServiceA, testServiceA1); //结果为 true,是同一个引用,在整个进程中获取的都是同一个实例   }   ///作用域生命周期   {    //IServiceCollection serviceCollection = new ServiceCollection();    //serviceCollection.AddScoped<ITestServiceA, TestServiceA>(); //作用域生命周期;同一个作用域,获取的是同一个对象的实例;不同的作用域,获取的是不同的对象实例    //ServiceProvider serviceProvider = serviceCollection.BuildServiceProvider();    //ITestServiceA testServiceA = serviceProvider.GetService<ITestServiceA>();    //ITestServiceA testServiceA1 = serviceProvider.GetService<ITestServiceA>();    //bool isOK = object.ReferenceEquals(testServiceA, testServiceA1);    //ServiceProvider serviceProvider1 = serviceCollection.BuildServiceProvider();    //ITestServiceA testServiceA2 = serviceProvider1.GetService<ITestServiceA>();    //bool isOK1 = object.ReferenceEquals(testServiceA1, testServiceA2);   }   

No comments:

Post a Comment