C#/.NET 5下ConcurrentDictionary缓存应注册为Singleton还是Transient?
答复
你的理解完全正确,这个自定义缓存类应当注册为Singleton,而非Transient。
- 依赖注入容器中
Transient生命周期的核心规则是:每一次请求获取该类型实例时,都会创建一个全新对象。如果把这个缓存类注册为Transient,每次注入、每次请求拿到的实例都持有独立的ConcurrentDictionary,不仅不同请求的缓存数据无法共享,请求结束后实例被回收,所有缓存内容都会直接清空,你设置的30分钟全局缓存有效期完全没有作用。 Singleton生命周期的服务在整个应用运行周期内仅创建一次,所有请求共享同一个实例,内部的ConcurrentDictionary会持续保留,缓存的读写、过期逻辑才能正常生效。
注意事项
- 你选用
ConcurrentDictionary作为存储已经满足了多线程读写的线程安全要求,如果你自己实现了过期缓存的后台清理逻辑,需要额外注意清理操作的并发安全,避免出现异常。 - 注册为Singleton后要注意生命周期匹配问题:不要直接在Singleton服务中注入
Scoped类型的依赖,如果确实需要使用Scoped服务,可以在对应逻辑执行时手动创建作用域获取实例,避免生命周期不匹配导致的问题。
内容的提问来源于stack exchange,提问作者earthy
相关产品推荐
相关产品推荐

