使用属性来缓存方法的返回结果C#

时间:2010-05-05 02:01:43

标签: c# .net caching attributes

在web方法中,通过注释[WebMethod(CacheDuration ...]属性来实现缓存非常简单。我们可以为非web方法创建类似的东西,例如静态方法吗?

感谢任何帮助/提示。

3 个答案:

答案 0 :(得分:4)

没有内置功能可以实现您想要的功能。您应该使用Httpruntime.Cache

它不是内置功能,但您可以使用面向方面编程(AOP)实现类似功能。使用方面缓存信息。

如果您感兴趣Spring.NET提供AOP

答案 1 :(得分:2)

使用Post Sharp检查this用于缓存的属性的简单实现。

答案 2 :(得分:1)

如果您无法使用AOP完成工作,您可以尝试使用我放在一起的这个小课程。

public MyClass CachedInstance
{
    get { return _cachedInstance.Value; }
}
private static readonly Cached<MyClass> _cachedInstance = new Cached<MyClass>(() => new MyClass(), TimeSpan.FromMinutes(15));

public sealed class Cached<T>
{
    private readonly Func<T> _createValue;
    private readonly TimeSpan _cacheFor;
    private DateTime _createdAt;
    private T _value;


    public T Value
    {
        get
        {
            if (_createdAt == DateTime.MinValue || DateTime.Now - _createdAt > _cacheFor)
            {
                lock (this)
                {
                    if (_createdAt == DateTime.MinValue || DateTime.Now - _createdAt > _cacheFor)
                    {
                        _value = _createValue();
                        _createdAt = DateTime.Now;
                    }
                }
            }
            return _value;
        }
    }


    public Cached(Func<T> createValue, TimeSpan cacheFor)
    {
        if (createValue == null)
        {
            throw new ArgumentNullException("createValue");
        }
        _createValue = createValue;
        _cacheFor = cacheFor;
    }
}