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