Используя атрибуты для кэширования возврата метода приводит к C#

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

Любая справка/подсказка ценится.

5
задан wonea 13 July 2017 в 11:32
поделиться

3 ответа

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

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

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

4
ответ дан 14 December 2019 в 08:45
поделиться

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

2
ответ дан 14 December 2019 в 08:45
поделиться

Если вы не можете использовать 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;
    }
}
1
ответ дан 14 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: