Dependency injection in ASP.NET Core
简介
- AddSingleton:此方法创建一个 Singletion 服务。首次请求时创建 Singleton 服务。然后,所有后续的请求中都会使用相同的实例。因此,通常每个应用程序只创建一次 Singleton 服务,并且在整个应用程序生命周期中使用该单个实例
- AddScoped:此方法创建一个 Scoped 服务。在范围内的每个请求中创建一个新的 Scoped 服务实例。例如在 Web 应用程序中,它为每个 HTTP 请求都创建 1 个实例,但在同一 Web 请求中的其它服务在调用这个请求的使用,都会使用相同的实例。注意,它在一个客户端请求中是相同的,但在多个客户端请求中是不同的
AddTransient:此方法创建一个 Transient 服务。每次请求时,都会创建一个新的 Transient 服务实例
案例
在 Create 页面中展示学生信息总人数:
@model Student
@inject IStudentRepository _StudentRepository
...
<div class="form-group row">
<div class="col-sm-10">
学生信息总人数 = @_StudentRepository.GetAllStudents().Count().ToString()
</div>
</div>
AddSingleton:总人数可以一直递增
- 整个应用程序池中只有一个服务实例
- AddScoped:总人数最多增加到 4
- 点击创建后的 HTTP 请求可以贯穿整个 Create 方法,所以总人数可以加 1
- 但再点击创建时,会是一个全新的 Post 请求,创建一个新的 Scoped 服务实例
- AddTransient:总人数一直是 3
- 每一次发出 HTTP 请求时,总会创建一个新的 Transient 服务实例
服务类型 | 同一个 HTTP 请求的范围 | 横跨多个不同 HTTP 请求 |
---|---|---|
Singleton Service | 同一个实例 | 同一个实例 |
Scoped Service | 同一个实例 | 新实例 |
Transient Service | 新实例 | 新实例 |