Dependency injection in ASP.NET Core

简介

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

    案例

    在 Create 页面中展示学生信息总人数:

    1. @model Student
    2. @inject IStudentRepository _StudentRepository
    3. ...
    4. <div class="form-group row">
    5. <div class="col-sm-10">
    6. 学生信息总人数 = @_StudentRepository.GetAllStudents().Count().ToString()
    7. </div>
    8. </div>
  • AddSingleton:总人数可以一直递增

    • 整个应用程序池中只有一个服务实例
  • AddScoped:总人数最多增加到 4
    • 点击创建后的 HTTP 请求可以贯穿整个 Create 方法,所以总人数可以加 1
    • 但再点击创建时,会是一个全新的 Post 请求,创建一个新的 Scoped 服务实例
  • AddTransient:总人数一直是 3
    • 每一次发出 HTTP 请求时,总会创建一个新的 Transient 服务实例
服务类型 同一个 HTTP 请求的范围 横跨多个不同 HTTP 请求
Singleton Service 同一个实例 同一个实例
Scoped Service 同一个实例 新实例
Transient Service 新实例 新实例