在启动时,我想为我的网络应用创建一个静态数据存储。所以我最终偶然发现了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会在这种情况下工作吗?
答案 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(...);
}