【问题标题】:How to clear cacheKey in separate instance of IMemoryCache如何在 IMemoryCache 的单独实例中清除 cacheKey
【发布时间】:2020-01-31 20:47:20
【问题描述】:

我在ASP.NET Core 1.1 上运行,我在Startup.cs 中配置策略以及DistributedMemoryCache,如下所示:

var roleRepo = new RoleRepo(Configuration, new MemoryCache(new MemoryCacheOptions()));

services.Configure<AuthorizationOptions>(options =>
{
    options.AddPolicy("MyPolicy", policy => policy.Requirements.Add(new MyPolicyRoleRequirement(roleRepo)));
});

services.AddDistributedMemoryCache();

//...

services.AddTransient<IRoleRepo, RoleRepo>();

我遇到的问题是我正在尝试删除特定用户的特定 cacheKey。当用户被添加到新角色时,我会尝试删除该缓存键(用户名加角色名)的现有缓存条目,然后使用更新的“isInRole”值重新添加。但是当我的控制器删除,然后添加新的 cacheKey 检查查询是否存在时,它总是返回 null。然后,如果我尝试导航到检查用户是否处于角色中的页面,该检查仍会显示 cacheKey 的 PREVIOUS 值。

我相信正在发生的事情是,由于我的策略通过了我的 RoleRepo 的单个实例(注入 IMemoryCache),它最终成为一个单独的实例,而不是在 @ 987654328@线。

如何配置它,以便 IMemoryCache 是单例,或者专门将我的 RoleRepo 的 SAME 实例传递到 services.AddTransient 行?

这是我的 `RoleRepo 设置:

private readonly IMemoryCache _memoryCache;

public RoleRepo(IConfigurationRoot configuration, IMemoryCache memoryCache)
    : base(configuration)
{
    _memoryCache = memoryCache;
}

【问题讨论】:

  • 看这里的方法:github.com/aspnet/Extensions/blob/…,你会看到如果成功,它会被添加为单例。除了您显示的代码之外 - 只能进行猜测。能不能把和缓存交互的代码也加进去?
  • 拥有临时内存缓存有什么意义?这只会创建缓存的多个实例,这有点使它无用,因为每个请求,甚至每个解析都会访问它的不同实例。内存缓存的唯一值是它是否是单例并且在请求中存活

标签: c# asp.net-core caching asp.net-core-1.1


【解决方案1】:

我找到了解决问题的方法。由于我正在“更新”我的 RoleRepo,我只是继续添加那个实例作为单例......

services.AddSingleton<IRoleRepo>(roleRepo);

【讨论】:

    猜你喜欢
    • 2019-01-30
    • 2018-12-26
    • 2015-04-11
    • 2013-04-11
    • 1970-01-01
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多