欢迎光临
个人技术文档整理

.NET Core 依赖注入(DI)-AddSingleton AddScoped AddTransient 的差异(三)

简介

  • AddSingleton:此方法创建一个 Singletion 服务。首次请求时创建 Singleton 服务。然后,所有后续的请求中都会使用相同的实例。因此,通常每个应用程序只创建一次 Singleton 服务,并且在整个应用程序生命周期中使用该单个实例。生命周期最长。
  • AddScoped:此方法创建一个 Scoped 服务。在范围内的每个请求中创建一个新的 Scoped 服务实例。例如在 Web 应用程序中,它为每个 HTTP 请求都创建 1 个实例,但在同一 Web 请求中的其它服务在调用这个请求的使用,都会使用相同的实例。注意,它在一个客户端请求中是相同的,但在多个客户端请求中是不同的
  • AddTransient:此方法创建一个 Transient 服务。每次请求时,都会创建一个新的 Transient 服务实例。生命周期最短。 

 

案例

测试代码

服务接口类

    public interface ICountService
    {
        int GetCount();
    }
    public class CountService : ICountService
    {
        private int _count { get; set; }
        public int GetCount()
        {
            _count++;
            return _count;
        }
    }

控制器

        private readonly ICountService _CountService;
        private readonly ICountService _CountService2;
        public HomeController(ICountService countService, ICountService countService2)
        {
            _CountService = countService;
            _CountService2 = countService2;
        }
        public IActionResult Index()
        {
            ViewBag.Count = _CountService.GetCount();
            ViewBag.Count2 = _CountService2.GetCount();
            return View();
        }

Index.cshtml

@{
    ViewData["Title"] = "Home Page";

}

<div class="text-center"> 
    <h1>
     统计数= @ViewBag.Count 
    </h1>  
    <h1>
     统计数2= @ViewBag.Count2
    </h1>  
</div>

在Startup中的ConfigureServices方法中注册服务

            // services.AddSingleton<ICountService, CountService>();//单例模式
            // services.AddTransient<ICountService, CountService>();//瞬态模式
            //services.AddScoped<ICountService, CountService>();//域模式



执行结果

  • AddSingleton:统计数可以一直递增:(多用)
  • AddScoped:统计数 最多增加到 2:
  • AddTransient:统计数  一直是 1






区别

服务类型

同一个 HTTP 请求的范围

横跨多个不同 HTTP 请求

Singleton Service

同一个实例

同一个实例

Scoped Service

同一个实例

新实例

Transient Service

新实例

新实例

 

赞(1)