1 一个简单的例子。
1.1 准备一个 DisposableOrderService
public interface IOrderService { }
public class DisposableOrderService : IOrderService, IDisposable
{
public void Dispose()
{
Console.WriteLine("DisposableOrderService:Dispose");
}
}
1.2 各生命周期 场景下使用
1.2.1 trans
//注册
builder.Services.AddTransient<IOrderService, DisposableOrderService>();
//在控制器下使用。
[HttpGet]
public void GetServiceList(
[FromServices] IOrderService s1,
[FromServices] IOrderService s2
)
{
Console.WriteLine($" s1 : {s1.ToString()} {s1.GetHashCode()}");
Console.WriteLine($" s2 : {s2.ToString()} {s2.GetHashCode()}");
}
1.2.2 scop 【重点】
作用域模式下,仅Dispose 一次。
//创建一个子容器。 HttpContext.RequestServices 是当前请求的一个子容器。
using (IServiceScope scope = HttpContext.RequestServices.CreateScope()) {
var s3 = scope.ServiceProvider.GetService<IOrderService>();
var s4 = scope.ServiceProvider.GetService<IOrderService>();
var s5 = scope.ServiceProvider.GetService<IOrderService>();
var s6 = scope.ServiceProvider.GetService<IOrderService>();
var s7 = scope.ServiceProvider.GetService<IOrderService>();
Console.WriteLine($" s3 : {s3.ToString()} {s3.GetHashCode()}");
}
Console.WriteLine("==
1.2.3 单例,直接创建服务实例 (都不释放) , 即使
注意避坑, 不要直接在根容器下,直接创建服务 。
直接在控制器的构造函数里去创。