【问题标题】:Service lifetimes transient vs scoped vs singleton [closed]服务生命周期瞬态 vs 范围 vs 单例 [关闭]
【发布时间】:2019-03-17 09:05:21
【问题描述】:

我在

上找到了一篇文章

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.1

它解释了 asp.net 核心 DI 和服务生命周期。

文章提到以下生命周期:

  • 瞬态
  • 范围
  • 单例

我试图找到一个真实世界的例子,或者至少是一个关于何时使用每个生命周期的更好解释。

【问题讨论】:

  • 我们使用 Autofac 等效的“Scoped”作为我们的用户上下文对象。我们在这里缓存所有权限检查结果,以便我们可以减少数据库的负载。用户上下文对象的生命周期与 Web 请求的生命周期相同。我们将“Singleton”用于特殊的工厂服务,因为它们为应用程序的生命周期而存在,我们将“瞬态”用于工厂生产的东西、不应该为应用程序生命周期的服务等。
  • transient - 不存储状态; scoped - 存储请求生命周期的状态;单例 - 存储应用程序生命周期的状态

标签: c# asp.net asp.net-core dependency-injection


【解决方案1】:

3 个例子:

Singleton - 这些可能存在于整个应用程序范围的配置设置中,例如在整个游戏过程中跟踪玩家进度的游戏管理器。

Scoped - 建议对实体框架上下文进行限定,以便您可以重用连接属性。

Transient - 实体框架上下文不能被 2 个线程共享,所以如果你想做任何异步工作。您将使用瞬态,以便为每个组件创建一个新的上下文实例。否则,您必须等待作用域组件完成,然后才能移动到下一个。

【讨论】:

  • 正确答案。您可以添加一些与强制依赖陷阱相关的信息。
  • 这是否意味着 Transient 是唯一在异步调用期间不阻塞的生命周期?
  • @TomDane 在上面的 3 个作用域中确实是正确的,如果在线程情况下使用单例,可能会被多次创建,作用域生命周期旨在用于单个作用域,例如一个网络请求。所以在这些场景中不需要多线程。
猜你喜欢
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
相关资源
最近更新 更多