使用UnitOfWork进行缓存

时间:2016-06-14 23:12:50

标签: c# wpf mvvm

目前我的程序不断重复查询相同的存储库。我目前正在使用UnitOfWork模式查询我的表格。

例如经常运行的查询

var peopleCollection = UnitOfWork.PersonRepository.Get(x => x.Active);

为了增强我的软件以减少重复性任务,我可以问一下,如果我有一个UnitOfWork模式,我应采取什么样的方法来缓存。我知道我可以将集合保存到字典中,并在我想要使用它时调用该字典。但这种方法的主要问题是,如果另一个用户要保存一个新人,我会有一个过时的人群。

1 个答案:

答案 0 :(得分:0)

简短的回答是,每种情况都需要稍微不同的解决方案。

通常,最好的解决方案是使用Decorator模式来缓存重复的数据调用,并确保缓存使旧的数据失效,并使用适当的过期策略。

例如,假设您的用户不会感到拥有最长60秒的Person数据。在这种情况下,您可以将缓存过期期间设置为60秒。

这是一个通用缓存项的示例,非常适合存储在字典中:

public class CachedItem<T>
{
    private readonly T _item; 
    private readonly DateTime _expirationTime;

    public CachedItem(T obj, TimeSpan cacheDuration)
    {
        _item = obj;
        _expirationTime = DateTime.Now.Add(cacheDuration);
    }

    public bool IsExpired { get { return DateTime.Now > _expirationTime; } }

    public T Item
    {
        get
        {
            if (IsExpired)
                throw new InvalidOperationException("Expired Cached Items cannot be retrieved.");

            return _item;
        }
    }
}