1.瞬时生命周期,AddTransient------每次获取的对象的实例都是全新的实例
ServiceCollection serviceCollection = new ServiceCollection();
// 注册抽象与具体实现
serviceCollection.AddTransient<IPower, Power>();
serviceCollection.AddTransient<IPhone, ApplePhone>();
serviceCollection.AddTransient<IMicrophone, Microphone>();
serviceCollection.AddTransient<IHeadphone, Headphone>();
//Build下得到一个Provider
ServiceProvider provider = serviceCollection.BuildServiceProvider();
IPhone? phone = provider.GetService<IPhone>();
phone?.Call();
2.作用域生命周期,使用AddScoped方法注册------同一个IServiceProvider获取的对象实例是同一个实例------内存指向是一样的
ServiceCollection serviceCollection = new ServiceCollection();
// 注册抽象与具体实现
serviceCollection.AddScoped<IPhone, ApplePhone>();
IServiceProvider provider1 = serviceCollection.BuildServiceProvider();
IPhone? phone1 = provider1.GetService<IPhone>();
IPhone? phone2 = provider1.GetService<IPhone>();
IServiceProvider provider2 = serviceCollection.BuildServiceProvider();
IPhone? phone3 = provider2.GetService<IPhone>();
IPhone? phone4 = provider2.GetService<IPhone>();
Console.WriteLine(object.ReferenceEquals(phone1,phone2)); // True
Console.WriteLine(object.ReferenceEquals(phone3,phone4)); // True
Console.WriteLine(object.ReferenceEquals(phone1,phone3)); // False
Console.WriteLine(object.ReferenceEquals(phone2,phone4)); // False
3.单例生命周期
ServiceCollection serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton<IMicrophone, Microphone>();
IServiceProvider provider3 = serviceCollection.BuildServiceProvider();
IMicrophone? microphone1 = provider3.GetService<IMicrophone>();
IServiceProvider provider4 = serviceCollection.BuildServiceProvider();
IMicrophone? microphone2 = provider4.GetService<IMicrophone>();
Console.WriteLine(object.ReferenceEquals(microphone1,microphone2)); // False
单例生命周期必须要在同一个IServiceProvider 中指向同一个地址
使用ServiceCollection需要安装两个依赖
Microsoft.Extensions.DependencyInjection.Abstractions
Microsoft.Extensions.DependencyInjection