Asp.Net Core:在控制器外部使用内存缓存

Spe*_*527 8 c# asp.net memorycache .net-core asp.net-core

在ASP.NET Core中,它很容易从控制器访问您的内存缓存

在你的创业公司中你添加:

public void ConfigureServices(IServiceCollection services)
        {
             services.AddMemoryCache();
        }
Run Code Online (Sandbox Code Playgroud)

然后从你的控制器

[Route("api/[controller]")]
public class MyExampleController : Controller
{
    private IMemoryCache _cache;

    public MyExampleController(IMemoryCache memoryCache)
    {
        _cache = memoryCache;
    }

    [HttpGet("{id}", Name = "DoStuff")]
    public string Get(string id)
    {
        var cacheEntryOptions = new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromHours(1));
        _cache.Set("key", "value", cacheEntryOptions);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如何在控制器外部访问相同的内存缓存.例如.我有一个由HangFire发起的计划任务,如何从我的代码中通过HangFire计划任务访问内存缓存?

public class ScheduledStuff
{
    public void RunScheduledTasks()
    {
        //want to access the same memorycache here ...
    }
}
Run Code Online (Sandbox Code Playgroud)

Tha*_*kur 8

我在这里有点晚了,但只是想补充一点以节省某人的时间。您可以在应用程序的任何位置通过 HttpContext 访问 IMemoryCache

var cache = HttpContext.RequestServices.GetService<IMemoryCache>();
Run Code Online (Sandbox Code Playgroud)

请确保在启动时添加 MemeoryCache

services.AddMemoryCache();
Run Code Online (Sandbox Code Playgroud)

  • 使用 HttpContext.RequestServices.GetService&lt;IMemoryCache&gt;() 时出现错误;:非静态字段、方法或属性需要对象引用。 (2认同)

Vit*_*nko 6

内存缓存实例可以注入到DI容器控制的任何组件中;这意味着您需要ScheduledStuffConfigureServices方法中配置实例:

public void ConfigureServices(IServiceCollection services) {
  services.AddMemoryCache();
  services.AddSingleton<ScheduledStuff>();
}
Run Code Online (Sandbox Code Playgroud)

并在ScheduledStuff构造函数中将IMemoryCache声明为依赖项:

public class ScheduledStuff {
  IMemoryCache MemCache;
  public ScheduledStuff(IMemoryCache memCache) {
    MemCache = memCache;
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 您不应该在代码中创建 `SheduledStuff` 实例,而是需要从 DI 容器中获取它 - 通过在 Controller 中将其定义为依赖项,或使用 `HttpContext.RequestServices`。 (2认同)