2017-08-18 42 views
3

我想使用Microsoft.Extensions.Caching.Memory.MemoryCache在.NET核2.0控制台应用程序(实际上,在其或者在控制台或在asp.net应用程序中使用的库)如何在C#Core Console应用程序中使用MemoryCache?

我创建了一个测试应用程序:

using System; 

namespace ConsoleTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var cache = new Microsoft.Extensions.Caching.Memory.MemoryCache(new Microsoft.Extensions.Caching.Memory.MemoryCacheOptions()); 

      int count = cache.Count; 
      cache.CreateEntry("item1").Value = 1; 
      int count2 = cache.Count; 
      cache.TryGetValue("item1", out object item1); 
      int count3 = cache.Count; 
      cache.TryGetValue("item2", out object item2); 
      int count4 = cache.Count; 

      Console.WriteLine("Hello World!"); 
     } 
    } 
} 

不幸的是,这是行不通的。这些项目不会添加到缓存中,并且无法检索。

我怀疑我需要使用DependencyInjection,做这样的事情:

using System; 
using Microsoft.Extensions.DependencyInjection; 

namespace ConsoleTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var provider = new Microsoft.Extensions.DependencyInjection.ServiceCollection() 
       .AddMemoryCache() 
       .BuildServiceProvider(); 

      //And now? 

      var cache = new Microsoft.Extensions.Caching.Memory.MemoryCache(new Microsoft.Extensions.Caching.Memory.MemoryCacheOptions()); 

      var xxx = PSP.Helpers.DependencyInjection.ServiceProvider; 
      int count = cache.Count; 
      cache.CreateEntry("item1").Value = 1; 
      int count2 = cache.Count; 
      cache.TryGetValue("item1", out object item1); 
      int count3 = cache.Count; 
      cache.TryGetValue("item2", out object item2); 
      int count4 = cache.Count; 

      Console.WriteLine("Hello World!"); 
     } 
    } 
} 

不幸的是,这也没有工作,我怀疑我不应该创建一个新的内存缓存,但是从服务中获得它提供者,但一直没能做到这一点。

任何想法?

回答

2

配置提供程序后取回通过GetService扩展方法

var provider = new ServiceCollection() 
         .AddMemoryCache() 
         .BuildServiceProvider(); 

//And now? 
var cache = provider.GetService<IMemoryCache>(); 

//...other code removed for brevity; 

缓存从评论:

它使用依赖注入是没有必要的,唯一需要的东西被处置返回CreateEntry()的值。 需要处置CreateEntry返回的条目。在 处置,它被添加到缓存:

using (var entry = cache.CreateEntry("item2")) { 
    entry.Value = 2; 
    entry.AbsoluteExpiration = DateTime.UtcNow.AddDays(1); 
} 
+0

@remcolam我会建议在这里检查文档,以确保你使用了正确的https://docs.microsoft.com/en-us/aspnet /核心/性能/缓存/内存#using-imemorycache – Nkosi

+0

啊,我缺少的组件是这样的:当由CreateEntry返回的条目需要处置。在配置时,它被添加到缓存中: using(var entry = cache.CreateEntry(“item2”)) { entry.Value = 2; entry.AbsoluteExpiration = DateTime.UtcNow.AddDays(1); } – remcolam

+0

PS:不需要使用依赖注入,唯一需要的是处理CreateEntry()的返回值 – remcolam

相关问题