如何在启动时将数据放入MemoryCache?

时间:2016-11-30 13:57:54

标签: asp.net-core asp.net-core-mvc .net-core

在启动时,我想为我的网络应用创建一个静态数据存储。所以我最终偶然发现了Microsoft.Extensions.Caching.Memory.MemoryCache。在构建使用MemoryCache的功能之后,我突然发现我存储的数据不可用。所以他们可能是两个不同的实例。

如何在Startup中访问将由我的其他Web应用程序使用的MemoryCache实例?这就是我目前正在尝试的方式:

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        //Startup stuff
    }

    public void ConfigureServices(IServiceCollection services)
    {
        //configure other services

        services.AddMemoryCache();

        var cache = new MemoryCache(new MemoryCacheOptions());
        var entryOptions = new MemoryCacheEntryOptions().SetPriority(CacheItemPriority.NeverRemove);

        //Some examples of me putting data in the cache
        cache.Set("entryA", "data1", entryOptions);
        cache.Set("entryB", data2, entryOptions);
        cache.Set("entryC", data3.Keys.ToList(), entryOptions);
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        //pipeline configuration
    }
}

我使用MemoryCache的控制器

public class ExampleController : Controller
{   
    private readonly IMemoryCache _cache;

    public ExampleController(IMemoryCache cache)
    {
        _cache = cache;
    }

    [HttpGet]
    public IActionResult Index()
    {
        //At this point, I have a different MemoryCache instance.
        ViewData["CachedData"] = _cache.Get("entryA");

        return View();
    }
}

如果无法做到这一点,是否有更好/更简单的替代方案?全球Singleton会在这种情况下工作吗?

2 个答案:

答案 0 :(得分:11)

添加声明时

<base href="https://polygit.org/components/">
<script src="webcomponentsjs/webcomponents-lite.js"></script>
<script>
  window.Polymer = {
    lazyRegister: true,
    useNativeCSSProperties: true
  }
</script>
<link rel="import" href="paper-input/paper-input.html">
<dom-module id="light-dom">
  <template>
    <style>
      #container ::slotted(paper-input) {
        --paper-input-container-focus-color: #ddd;
      }
    </style>
    <div id="container">
      <slot></slot>
    </div>
  </template>
</dom-module>
<script>
  Polymer({
    is: 'light-dom'
  })
</script>




<light-dom>
  <paper-input label="hello"></paper-input>
</light-dom>

你实际上是说你想要一个内存缓存单例,只要你在控制器中注入了IMemoryCache,它就会得到解决。因此,您需要将值添加到已创建的单例对象,而不是创建新的内存缓存。您可以通过将Configure方法更改为:

来完成此操作
services.AddMemoryCache();

答案 1 :(得分:1)

使用Configure方法,而不是ConfigureServices

public void Configure(IApplicationBuilder app, IMemoryCache cache, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    cache.Set(...);
}