我必须缓存常见的数据库数据,比如下拉菜单中显示的数据。我用过MemoryCache
。我使用Entity Framework code first
andAutofac
进行依赖注入。
这是我在解决方案中所做的部分工作,可能对您不起作用,但对我有用,虽然并不完美,但需要进行大量清理工作。
我的ICacheManager
界面:
public interface ICacheManager
{
T Get<T>(string key);
void Set(string key, object data, int cacheTime);
bool IsSet(string key);
void Remove(string key);
void Clear();
}
我的CacheManager
班级:
public class CacheManager : ICacheManager
{
private ObjectCache Cache
{
get
{
return MemoryCache.Default;
}
}
public T Get<T>(string key)
{
return (T)Cache[key];
}
public void Set(string key, object data, int cacheTime)
{
if (data == null)
{
return;
}
CacheItemPolicy policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTime.Now + TimeSpan.FromMinutes(cacheTime);
Cache.Add(new CacheItem(key, data), policy);
}
public bool IsSet(string key)
{
return (Cache.Contains(key));
}
public void Remove(string key)
{
Cache.Remove(key);
}
public void Clear()
{
foreach (var item in Cache)
{
Remove(item.Key);
}
}
}
我的缓存的扩展类:
public static class CacheExtensions
{
public static T Get<T>(this ICacheManager cacheManager, string key, Func<T> acquire)
{
return Get(cacheManager, key, 60, acquire);
}
public static T Get<T>(this ICacheManager cacheManager, string key, int cacheTime, Func<T> acquire)
{
if (cacheManager.IsSet(key))
{
return cacheManager.Get<T>(key);
}
else
{
var result = acquire();
cacheManager.Set(key, result, cacheTime);
return result;
}
}
}
这就是我在存储库类中使用它的方式。此方法返回我所有银行的列表,该列表显示在下拉列表中。
public class BankRepository : RepositoryBase<Bank>, IBankRepository
{
private readonly ICacheManager cacheManager;
private const string BanksAllCacheKey = "banks-all";
public BankRepository(IDatabaseFactory databaseFactory, ICacheManager cacheManager)
: base(databaseFactory)
{
Check.Argument.IsNotNull(cacheManager, "cacheManager");
this.cacheManager = cacheManager;
}
public IEnumerable<Bank> FindAll()
{
string key = string.Format(BanksAllCacheKey);
return cacheManager.Get(key, () =>
{
var query = from bank in DatabaseContext.Banks
orderby bank.Name
select bank;
return query.ToList();
});
}
}
我希望这有帮助。这是一个非常简单的实现,但它对我有用。网上有很多关于如何使用缓存策略的文章ASP.NET MVC
。只是Google
它。