3 作用域与对象释放。 (.net 上手笔记)

76 阅读1分钟

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()}");

    }

image.png

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 单例,直接创建服务实例 (都不释放) , 即使

注意避坑, 不要直接在根容器下,直接创建服务 。
直接在控制器的构造函数里去创。