Использование атрибутов для кэширования результатов возврата метода в C # - PullRequest
5 голосов
/ 05 мая 2010

В веб-методах очень просто реализовать кэширование с помощью аннотирования атрибута [WebMethod (CacheDuration ...]. Можем ли мы создать что-то подобное для не веб-методов, таких как статические методы?

Любая помощь / совет приветствуется.

Ответы [ 3 ]

4 голосов
/ 05 мая 2010

Нет встроенной функции для достижения именно того, что вы хотите. Вы должны использовать Httpruntime.Cache.

Это не встроенная функция, но вы можете достичь чего-то подобного, используя аспектно-ориентированное программирование (AOP). Кеширование информации с использованием аспектов.

В случае, если вам интересно Spring.NET предоставляет AOP

2 голосов
/ 05 мая 2010

Проверка это простая реализация атрибута для кэширования с использованием Post Sharp.

1 голос
/ 05 мая 2010

Если вы не можете использовать 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...