在Asp.Net core中的IServiceCollection容器中注册服务的生命周期分以下3种:
1、Transient
通过AddTransient注册,会在IServiceCollection容器每次被请求时创建实例。
暂时生存期服务 (AddTransient) 是每次从服务容器进行请求时创建的。 这种生存期适合轻量级、 无状态的服务。
在处理请求的应用中,在请求结束时会释放临时服务。
2、Scoped
通过AddScoped注册,会在每次客户端请求时创建实例
作用域生存期服务 (AddScoped) 以每个客户端请求(连接)一次的方式创建。
在处理请求的应用中,在请求结束时会释放有作用域的服务。
警告
在中间件内使用有作用域的服务时,请将该服务注入至 Invoke
或 InvokeAsync
方法。
请不要通过构造函数注入进行注入,因为它会强制服务的行为与单一实例类似。
有关详细信息,请参阅 写入自定义 ASP.NET Core 中间件。
3、Singleton
通过AddSingleton注册,会在第一次被请求时创建实例,之后的每个请求都会使用这个实例
单一实例生存期服务 (AddSingleton) 是在第一次请求时(或者在运行 Startup.ConfigureServices
并且使用服务注册指定实例时)创建的。 每个后续请求都使用相同的实例。 如果应用需要单一实例行为,建议允许服务容器管理服务的生存期。 不要实现单一实例设计模式并提供用户代码来管理对象在类中的生存期。
在处理请求的应用中,在应用关闭,释放 ServiceProvider 时,会释放单一实例服务。
警告
从单一实例解析有作用域的服务很危险。 当处理后续请求时,它可能会导致服务处于不正确的状态。
示例:
方法 | 自动 对象处置 | 多种 实现 | 传递参数 |
---|---|---|---|
Add{LIFETIME}<{SERVICE}, {IMPLEMENTATION}>() 示例: services.AddSingleton<IMyDep, MyDep>(); |
是 | 是 | 否 |
Add{LIFETIME}<{SERVICE}>(sp => new {IMPLEMENTATION}) 示例: services.AddSingleton<IMyDep>(sp => new MyDep()); services.AddSingleton<IMyDep>(sp => new MyDep("A string!")); |
是 | 是 | 是 |
Add{LIFETIME}<{IMPLEMENTATION}>() 示例: services.AddSingleton<MyDep>(); |
是 | 否 | 否 |
AddSingleton<{SERVICE}>(new {IMPLEMENTATION}) 示例: services.AddSingleton<IMyDep>(new MyDep()); services.AddSingleton<IMyDep>(new MyDep("A string!")); |
否 | 是 | 是 |
AddSingleton(new {IMPLEMENTATION}) 示例: services.AddSingleton(new MyDep()); services.AddSingleton(new MyDep("A string!")); |
否 | 否 | 是 |
测试注册和生命周期如下:
结论:
Transient对象始终不同,每一次请求OperationID都会改改变。
Scoped对象在同一客户端请求是相同的,但在多个客户端是不同的。
Singleton,SingletonInstance对每个对象每个请求都是相同的。
代码示例:https://files.cnblogs.com/files/Zhengxue/tryDotNetCoreDoc.zip