Использование Redis кеша с Entity Framework - PullRequest
0 голосов
/ 10 июня 2018

Я использую библиотеку EFCache.Redis в ASP.NET MVC 5 с проектом Entity Framework 6 для кэширования результатов запросов.В тестовом проекте этого пакета есть несколько хороших примеров:

    [TestMethod]
    public void Item_cached()
    {
        var cache = new RedisCache("localhost:6379");
        var item = new TestObject { Message = "OK" };

        cache.PutItem("key", item, new string[0], TimeSpan.MaxValue, DateTimeOffset.MaxValue);

        object fromCache;

        Assert.IsTrue(cache.GetItem("key", out fromCache));
        Assert.AreEqual(item.Message, ((TestObject)fromCache).Message);

        Assert.IsTrue(cache.GetItem("key", out fromCache));
        Assert.AreEqual(item.Message, ((TestObject)fromCache).Message);
    }

Но мне нужно что-то вроде вспомогательного класса, чтобы избежать повторения кода.Поэтому я пишу этот код:

public class CacheManager : ICacheManager
{

    private RedisCache _cache;
    public CacheManager()
    {
        _cache = new RedisCache("localhost:6379");
    }

    public object GetCache(string key, Func<object> factory, string[] relatedEntitties = null)
    {
        if (string.IsNullOrEmpty(key))
            throw new Exception("Cache key cannot be null");

        if (relatedEntitties == null)
            relatedEntitties = new string[0];

        object fromCache;
        _cache.GetItem(key, out fromCache);

        if (fromCache == null)
        {
            fromCache = factory();
            _cache.PutItem(key, fromCache, relatedEntitties, TimeSpan.MaxValue, DateTimeOffset.MaxValue);
        }

        return fromCache;
    }

    public void InvalidateCache(string key)
    {
        _cache.InvalidateItem(key);
    }

    public void InvalidateSets(string[] sets)
    {
        _cache.InvalidateSets(sets);
    }
}

И использую его следующим образом:

CacheManager cacheManager = new CacheManager();
var artists = cacheManager.GetCache("artists", () => getArtists(), new string[] { "Artist" });

Метод "getArtists":

    private List<Artist> getArtists()
    {
        var artists = new List<Artist>();

        using (var ctx = new MusicStoreContext())
        {
            artists = ctx.Artists.ToList();
        }

        return artists;
    }

В методе "GetCache",Я проверяю, существует ли сущность в кэше, я использую ее, в противном случае запрашиваю из базы данных.С этой частью проблем нет, но я не уверен, подключился ли я к серверу redis, который я реализовал в конструкторе классов.Таким образом, везде, где я создаю экземпляр CacheManager, он пытается подключиться к серверу.Я не знаю, правда ли это?Или он должен подключиться один раз?Могу ли я установить этот класс статическим?Обычно я хочу знать лучшую реализацию для вспомогательного класса, если кто-нибудь знает лучший способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...