2017-08-18 1 views
3

würde Ich mag die Microsoft.Extensions.Caching.Memory.MemoryCache in einer .NET-Core 2.0 Konsolenanwendung verwenden (Eigentlich in einer Bibliothek, die entweder in einer Konsole oder in einer asp.net app verwendet wird)Wie wird MemoryCache in der C# Core Console App verwendet?

Ich habe eine Test App erstellt:

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!"); 
     } 
    } 
} 

Leider funktioniert das nicht. Die Elemente werden dem Cache nicht hinzugefügt und sie können nicht abgerufen werden.

Ich vermute, ich brauche Dependency Injection zu verwenden, so etwas wie dies zu tun:

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!"); 
     } 
    } 
} 

Leider ist dies auch nicht funktioniert, ich vermute, ich sollte nicht einen neuen Speicher-Cache erstellen, aber es aus dem Dienst bekommen Anbieter, aber das war nicht möglich.

Irgendwelche Ideen?

Antwort

2

Nachdem der Provider die Konfiguration abrufen, den Cache über das GetService Erweiterungsmethode

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

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

//...other code removed for brevity; 

Von Kommentare:

Es ist nicht zu verwenden, Dependency Injection erforderlich, das einzige, was nötig war Anordnen der Rückkehr Wert von CreateEntry(). Der von CreateEntry zurückgegebene Eintrag muss entsorgt werden. Auf verfügen, wird es in dem Cache hinzugefügt:

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

@remcolam ich Dokumentation vorschlagen würde Überprüfung hier, um sicherzustellen, Sie verwenden es richtig https://docs.microsoft.com/en-us/aspnet/core/performance/caching/speicher # using-imemorycache – Nkosi

+0

Ah, die Komponente, die ich vermisste, ist dies: Wenn der von CreateEntry zurückgegebene Eintrag entsorgt werden muss. Bei der Entsorgung wird es dem Cache hinzugefügt: mit (var entry = cache.CreateEntry ("item2")) { entry.Value = 2; entry.AbsoluteExpiration = DateTime.UtcNow.AddDays (1); } – remcolam

+0

PS: Es ist nicht erforderlich, Abhängigkeitsinjektion zu verwenden, das einzige, was benötigt wurde, entsorgte den Rückgabewert von CreateEntry() – remcolam

Verwandte Themen