C# 在实体框架中使用Redis缓存

C# 在实体框架中使用Redis缓存,c#,asp.net-mvc,redis,entity-framework-6,C#,Asp.net Mvc,Redis,Entity Framework 6,我正在使用ASP.NETMVC5和EntityFramework6项目中的库来缓存查询结果。本软件包的以下部分提供了一些很好的示例: [TestMethod] public void Item_cached() { var cache = new RedisCache("localhost:6379"); var item = new TestObject { Message = "OK" }; cache.PutItem

我正在使用ASP.NETMVC5和EntityFramework6项目中的库来缓存查询结果。本软件包的以下部分提供了一些很好的示例:

    [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);
    }
但我需要的是类似于helper类的东西,以避免重复代码。所以我写了这段代码:

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);
    }
}
“getArtists”方法:

private List getArtists()
{
var artists=新列表();
使用(var ctx=new MusicStoreContext())
{
artists=ctx.artists.ToList();
}
回归艺术家;
}

在“GetCache”方法中,我检查缓存中是否存在实体,我使用它,否则从数据库查询。这一部分没有问题,但我不确定的是连接到我在类构造函数中实现的redis服务器。通过这种方式,无论我在何处创建CacheManager实例,它都会尝试连接到服务器。我不知道这是真的吗?或者它应该连接一次?我可以将这个类设置为静态吗?一般来说,如果有人知道更好的方法,我想知道帮助器类的最佳实现。

试着在代码评审中发布这个。一般来说,我认为您应该将缓存抽象为IDistributedCache或您自己的单例提供者,这样您就不必直接从您的服务甚至缓存管理器与Redis交互。
CacheManager cacheManager = new CacheManager();
var artists = cacheManager.GetCache("artists", () => getArtists(), new string[] { "Artist" });
    private List<Artist> getArtists()
    {
        var artists = new List<Artist>();

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

        return artists;
    }