【问题标题】:When caching identities, should it be Singleton or Scoped?缓存身份时,应该是 Singleton 还是 Scoped?
【发布时间】:2018-05-02 00:32:40
【问题描述】:

在为多种用户缓存身份信息时,特别是在单个缓存对象中可能发生键冲突的情况下,我通常通过创建自定义缓存类来对缓存进行分区:

public BackEndUserCache: MemoryCache {
  ...
}
public FrontEndUserCache: MemoryCache {
  ...
}

我一直在考虑是否必须将依赖项注入为 Singleton 或 Scoped?

澄清一下:

1- 我认为如果我将这些绑定到 IMemoryCache 作为 Singleton,则可能存在安全漏洞,因为所有用户的凭据都将缓存在单个全局缓存列表中。

2- 如果我以 Scoped 方式绑定它,缓存对象将为每个连接创建,并且会话终止时将过期。但这在缓存时有意义吗?

【问题讨论】:

  • 你想通过从 MemoryCache 继承来实现什么?
  • 作为一般规则,Web 应用程序中的几乎每个依赖项都应该是请求范围的(或者在 ASP.NET Core 用语中只是“范围”)。如果要使用单例范围,则需要 100% 确定依赖项所做的任何事情都是完全线程安全的,这是一个相当高的标准。
  • @ChrisPratt:微软所说的内存缓存是线程安全的。

标签: c# caching asp.net-core asp.net-core-mvc asp.net-core-mvc-2.0


【解决方案1】:

对于任何特定于用户的数据,请使用scoped 缓存。为国家、邮政编码、产品等常见数据创建另一个 singleton 缓存服务类。

因此您需要两个接口,IScopedCacheService 和 ISingletonCacheService

public class ScopedCacheService : IScopedCacheService
{
    private IMemoryCache _memoryCache;
    public ScopedCacheService (IMemoryCache memoryCache)
    {
        _memoryCache = memoryCache;
    }
    ...
}

}

SingletonCacheService 类的类似实现。您可以通过以下方式在服务中注册它们:

services.AddMemoryCache();
services.AddSingleton<IScopedCacheService, ScopedCacheService>();
services.AddSingleton<ISingletonCacheService, SingletonCacheService>();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-07
    • 2020-04-10
    • 2019-08-23
    • 1970-01-01
    • 2017-07-18
    • 2017-07-20
    • 1970-01-01
    • 2016-07-09
    相关资源
    最近更新 更多