ServiceCollection IOC容器 服务的生命周期
- ServiceCollection 一、Program.cs 注入组件接口服务等
builder.Services.AddSingleton(new AppSettings(builder.Configuration)); builder.Services.AddScoped(typeof(IBaseService<>), typeof(BaseService<>)); builder.Services.AddTransient();
二、组件的生命周期
创建测试类
public interface ISqlHelper{
void GetAll();
}
public class SqlServerHelper : ISqlHelper{
public void GetAll()
{
Console.WriteLine("我被执行");
}
} static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddTransient();
var provider=services.BuildServiceProvider();
var sqlHelper=provider.GetService();
sqlHelper= provider.GetService();
Console.ReadKey();
}
输出1次:我被执行static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddScoped();
var provider=services.BuildServiceProvider();
var scope1=provider.CreateScope();//在一个作用域下创建第一个子作用域
var sqlHelper= scope1.ServiceProvider.GetService();
sqlHelper= scope1.ServiceProvider.GetService();
Console.ReadKey();
}
结果输出1次:我被执行 这里的scope1 是同一个作用域static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddScoped();
var provider=services.BuildServiceProvider();
var scope1=provider.CreateScope();//在一个作用域下创建第一个子作用域
var scope2= provider.CreateScope();//在一个作用域下创建第二个子作用域
var sqlHelper= scope1.ServiceProvider.GetService();
sqlHelper= scope2.ServiceProvider.GetService();
Console.ReadKey();
}
结果输出2次:我被执行 这里的scope1,scope2 是2个不同的作用域 static void Main(string[] args)
{
ServiceCollection services = new ServiceCollection();
services.AddTransient();
var provider=services.BuildServiceProvider();
var sqlHelper=provider.GetService();
sqlHelper= provider.GetService();
Console.ReadKey();
}
结果会输出2次:我被执行,每次GetService 都会被重新创建