web-dev-qa-db-fra.com

Comment utiliser MemoryCache dans l'application C # Core Console?

Je souhaite utiliser Microsoft.Extensions.Caching.Memory.MemoryCache dans une application console .NET Core 2.0 (en fait, dans une bibliothèque qui est utilisée dans une console ou dans une application asp.net)

J'ai créé une application de test:

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

Malheureusement, cela ne fonctionne pas. Les éléments ne sont pas ajoutés au cache et ils ne peuvent pas être récupérés.

Je soupçonne que je dois utiliser DependencyInjection, en faisant quelque chose comme ceci:

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

Malheureusement, cela ne fonctionne pas non plus, je pense que je ne devrais pas créer un nouveau cache mémoire, mais l'obtenir auprès du fournisseur de services, mais je n'ai pas pu le faire.

Des idées?

9
remcolam

Après avoir configuré le fournisseur, récupérez le cache via la méthode d'extension GetService

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

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

//...other code removed for brevity;

D'après les commentaires:

Il n'est pas nécessaire d'utiliser l'injection de dépendances, la seule chose nécessaire était de supprimer la valeur de retour de CreateEntry (). L'entrée renvoyée par CreateEntry doit être supprimée. Lors de l'élimination, il est ajouté au cache:

using (var entry = cache.CreateEntry("item2")) { 
    entry.Value = 2; 
    entry.AbsoluteExpiration = DateTime.UtcNow.AddDays(1); 
}
13
Nkosi
IMemoryCache cache = new MemoryCache(new MemoryCacheOptions());
object result = cache.Set("Key", new object());
bool found = cache.TryGetValue("Key", out result);

Voir complet exemple de cache mémoire dans GitHub.

Vous devez ajouter NuGet Microsoft.Extensions.Caching.Memory packages dans votre projet pour une utilisation MemoryCache

6
Stanislav Prusac