【问题标题】:When to use following Transient, scoped and singleton何时使用以下瞬态、作用域和单例
【发布时间】:2021-07-16 07:01:39
【问题描述】:

我阅读了一些关于此的文章,并且了解了如何使用 Transient、Scoped 和 Singleton,但我对何时使用其中之一感到困惑。

我的理解:

单例:在需要存储员工数量的情况下,您可以创建单例,因为每次创建新员工时它都会增加数量,因此在这种情况下您需要单例。

Scoped:例如你正在玩生命数为5的游戏,然后你需要在玩家游戏结束时减少生命数。并且在每一次新的时间里你都需要新的实例,因为每一次你需要的生命数是 5。

Transient:何时使用 Transient??

如果我错了,请纠正我。 如果可能,请给出所有这些更好的例子。

【问题讨论】:

标签: asp.net-core dependency-injection singleton transient scoped


【解决方案1】:

据我所知,Singleton 通常用于全局单实例。例如,您将拥有一个图像存储服务,您可以拥有一个从给定位置加载图像并将它们保存在内存中以供将来使用的服务。

作用域生命周期表示每个客户端请求创建一次服务。通常我们将它用于sql连接。这意味着它将根据请求创建和处理 sql 连接。

每次从服务容器请求它们时,都会创建一个临时生命周期服务。例如,在一个请求期间,您使用 httpclient 服务多次调用其他 web api 请求,但 web api 端点不同。那时您会将 httpclient 服务注册为瞬态。这意味着每次调用 httpclient 服务时,它都会创建一个新的 httpclient 来发送不同的请求。

【讨论】:

  • 感谢您的解释..我得到了范围和瞬态但请您可以用不同的例子解释单例..提前谢谢您
  • 单例用于正常服务。例如。一些内存缓存,你可以从磁盘读取一些图像或数据到redis,这个动作在应用程序运行过程中不会改变。
  • 对于具有实用功能的类,例如 MeterToKm(int mtr) - 这应该是作用域还是单例?
【解决方案2】:

注意,Microsoft 提供了建议 herehere

在为依赖注入设计服务时:

  • 避免有状态的静态类和成员。通过将应用设计为使用单例服务来避免创建全局状态。
  • 避免在服务中直接实例化相关类。直接实例化将代码与特定实现相结合。
  • 使服务小型化、设计合理且易于测试。

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 2021-01-14
    • 2017-06-10
    • 2020-08-23
    • 1970-01-01
    • 2020-10-28
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多