Метод расширения, чтобы получить результат типа T из кэша


Есть ли проблемы любого рода с помощью этого метода расширения?

using System;
using System.Web;

namespace AccountingBackupWeb.CacheExtensions
{
    public static class Extensions
    {
        public static T Get<T>(this System.Web.Caching.Cache cache, string key, Func<T> f) where T : class
        {
            T results = HttpContext.Current.Cache[key] as T;

            if (results == null)
            {
                results = f();
                HttpContext.Current.Cache[key] = results;
            }

            return results;
        }
    }
}


584
6
c#
задан 15 декабря 2011 в 08:12 Источник Поделиться
Комментарии
6 ответов

Логически, это имеет смысл для меня, что вы хотели бы привязать ключ к Функ. Тогда этот метод мог просто взять строку и затем делегировать ответственность, чтобы решить, как получить значение в другой класс. Кроме того, несколько моментов волнует, что на самом деле есть. Я считаю, используя буквы, как переменные плохой практикой, поскольку она не дает никакого контекста о том, как он будет использоваться. Я бы переименовал "ф" что-то вроде "извлечь" или "извлечь". Кроме того, нет никакой гарантии, что под управлением "Ф" фактически не нулевое значение. В этом случае, я сомневаюсь, что вы бы хотите хранить значение null в кэше.

4
ответ дан 16 декабря 2011 в 02:12 Источник Поделиться

Без немного больше контекста о том, что ваши цели и/или проблемы трудно сказать. Это, кажется, хорошо, хотя функции передачи делегата является сравнительно дорогим, поэтому, если требуется гипер-производительности, вы должны выполнить рефакторинг, что. Помимо этого, единственной проблемой может быть свойство HttpContext.Текущая будучи нулем, который может вызвать исключение NullReferenceException, хотя я предполагаю, что это не возможно, учитывая ваш хостинг сценарию.

3
ответ дан 15 декабря 2011 в 09:12 Источник Поделиться

Как сказал JoeGeeky свойство HttpContext.Тока может быть нулевым, а лучше поупражняться в нем. Но я также хочу отметить, что с архитектурной точки зрения, это всегда лучше, чтобы инкапсулировать свой кэш узла (свойство HttpContext.Тока в вашем случае), так что ваши рамки кэш добытчик способ не зависеть от веб-классов.

Вы можете ввести абстрактный класс (или интерфейс) CacheHost и на время выполнения настроить уровень подкласса будет использоваться в качестве узла кэша. В большинстве случаев это может быть свойство HttpContext.Ток, но если запустить отдельный поток и там вы будете использовать методы, которые использует ваш кэш, тогда вы сможете использовать свой механизм кэширования, даже если отсутствует объект HttpContext.Тока в этом потоке.

1
ответ дан 16 декабря 2011 в 05:12 Источник Поделиться

Я просто есть небольшая проблема с само название метода. Это не дано по имени метод под названием "достали", что он на самом деле устанавливает значение кэш к результату F, если уже не установлен, а затем возвращает его.
Как насчет GetOrInitializeTo, и Вам метод, который просто получает?

1
ответ дан 18 декабря 2011 в 08:12 Источник Поделиться

В дополнение к тому, что уже сказано:


  • этот ключевой параметр может быть null

  • в Ф параметр может быть null

  • Механизм крайне неэффективен, если вы на самом деле хотите кэшировать значение null для конкретного ключа

1
ответ дан 20 декабря 2011 в 01:12 Источник Поделиться

Так как Т операция выльется в нуль, если значение на самом деле не null, но не типа T, вы могли бы рассмотреть возможность сделать дополнительную проверку, если результат является нулем, чтобы определить, является ли значение в кэш, что ключ на самом деле нуль. Пример реализации показан ниже:

    public static T Get<T>(this System.Web.Caching.Cache cache, string key, Func<T> f) where T : class
{
object value = cache[key];

T results = value as T;

if (results == null)
{
if (value != null)
{
// log a warning, because there is a non-null value in cache with this key, but it is not of the specified type.
}

results = f();
cache[key] = results;
}

return results;
}

По сути, если результат null, но значение не NULL, то это означает, что существует уже какое-то значение в кэш с заданным ключом, который имеет тип, т. я хотел бы рассмотреть эту ситуацию потенциального кодирования ошибок, так что я, скорее всего, хотите войти предупреждение или ошибку, если что-то случится.

В качестве альтернативы, вы могли бы бросить исключение. Это позволит вам сохранить детали вашего механизма выхода из этого метода.

1
ответ дан 22 декабря 2011 в 02:12 Источник Поделиться