ASP.NET Core :容器注入(二):生命周期作用域与对象释放

//瞬时生命周期
ServiceCollection services = new ServiceCollection();
services.AddTransient<TestServiceImpl>();
using (ServiceProvider sp = services.BuildServiceProvider())
{
    var ts1 = sp.GetRequiredService<TestServiceImpl>();
    var ts2 = sp.GetRequiredService<TestServiceImpl>();
    Console.WriteLine($"AddTransient注入:{object.ReferenceEquals(ts1, ts2)}");
}

//作用域
services.AddScoped<TestServiceImpl>();

using (ServiceProvider AddScoped = services.BuildServiceProvider())
{
    var se = new TestServiceImpl(); //注意长生命周期 不要引用比它短周期
    using (IServiceScope scope = AddScoped.CreateScope())
    {
        var t1 = scope.ServiceProvider.GetService<TestServiceImpl>();
        var t2 = scope.ServiceProvider.GetService<TestServiceImpl>();
        Console.WriteLine($"AddScoped注入:{object.ReferenceEquals(t1, t2)}");
        se = t2;
        Console.ReadLine();
    }
    //作用域
    using (IServiceScope scope2 = AddScoped.CreateScope())
    {
        var ts1 = scope2.ServiceProvider.GetService<TestServiceImpl>();
        var ts2 = scope2.ServiceProvider.GetService<TestServiceImpl>();

        Console.WriteLine($"AddScoped2注入:{object.ReferenceEquals(se, ts2)}");
        Console.ReadLine();
    }

}

可以看到同一个using下 是相同的,当用第一个内 去检验下一个 则为False

微软官方推荐 生命周期的选择:如果类无状态,建议为Singleton;如果类有状态,具有Scope 控制,建议为Scoped ,如果没有并发修改的问题,使用Transient的时候要谨慎!
参考:ASP.NET Core 依赖注入


作者:Bo-H

出处:https://www.cnblogs.com/Bo-H/p/16599363.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Bo-Hong  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题