在启动时,我想为我的Web应用程序创建静态数据存储。因此,我最终偶然发现了Microsoft.Extensions.Caching.Memory.MemoryCache。构建使用MemoryCache的功能后,我突然发现我存储的数据不可用。因此,它们可能是两个单独的实例。

如何在启动中访问将由其余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的Controller

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会工作吗?

最佳答案

添加语句时

services.AddMemoryCache();


您实际上是在说,您想要一个内存缓存单例,无论您在控制器中注入IMemoryCache的位置如何,它都能得到解决。因此,无需创建新的内存缓存,而是需要向创建的单例对象添加值。您可以通过将Configure方法更改为类似方法来做到这一点:

    public void Configure(IApplicationBuilder app,
        IHostingEnvironment env,
        ILoggerFactory loggerFactory,
        IMemoryCache cache )
{
    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);
    //pipeline configuration
}

关于asp.net-core - 如何在启动时将数据放入MemoryCache?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40890273/

10-13 06:55