Где кэширование должно произойти в приложении MVC ASP.NET?

Моя попытка, которая уже очень похожа на другие ответы,

df <- df[rep(1:nrow(df), each = 2),] ## Create a duplicate row after each row

df[seq(2,nrow(df),2),] <- df[seq(2,nrow(df),2),] %>% mutate(coords_x = case_when(event_rinkside == "R" ~ 82,
                                                        event_rinkside == "L" ~ -82,
                                                        TRUE ~ coords_x),
                                   coords_y = case_when(event_rinkside == "R" ~ 0,
                                                        event_rinkside == "L" ~ 0,
                                                        TRUE ~ coords_y)
)
13
задан Scott Saad 5 December 2008 в 02:01
поделиться

6 ответов

Я думаю, что это в конечном счете зависит от того, что Вы кэшируете. Если Вы хотите кэшировать результат представленных страниц, который сильно связывается к природе Http запроса и предложил бы механизм кэширования уровня ActionFilter.

Если с другой стороны, Вы хотите кэшировать данные, которые управляют самими страницами, то необходимо рассмотреть образцовое кэширование уровня. В этом случае контроллер не заботится, когда данные были сгенерированы, это просто выполняет логические операции на данных и готовит его к просмотру. Другой аргумент в пользу образцового кэширования уровня - то, если у Вас есть другие зависимости от данных модели, которые не присоединены к Вашему контексту Http.

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

7
ответ дан 1 December 2019 в 23:49
поделиться

Я не знаю anwser к Вашему вопросу, но переговоры Jeff Atwood о том, как, ТАКИМ ОБРАЗОМ, команда сделала кэширование с помощью платформы MVC для stackoverflow.com на недавнем шоу hanselminutes, что это могло бы выручить Вас:

http://www.hanselminutes.com/default.aspx?showID=152

3
ответ дан 1 December 2019 в 23:49
поделиться

Я думаю, что кэширование должно так или иначе быть связано с моделью. Я думаю, что контроллер не должен заботиться больше о данных. Ответственность за контроллер состоит в том, чтобы отобразить данные - независимо, куда это прибывает от - до представлений.

Попытайтесь также думать, почему необходимо кэшироваться? Вы хотите сохранить обработку, передачу данных или что? Это поможет Вам знать, где точно у Вас должен быть свой слой кэширования.

1
ответ дан 1 December 2019 в 23:49
поделиться

Быстрый ответ

Я запустил бы с кэширования КОНТРОЛЛЕРА, использовать атрибут OutputCache и позже добавить Модель, кэширующуюся при необходимости. Это более быстро для реализации и имеет мгновенные результаты.

Ответ детали (вызывают, мне нравится звук моей речи),

Вот пример.

[OutputCache(Duration=60, VaryByParam="None")]
public ActionResult CacheDemo() {
  return View();
}

Это означает, что, если пользователь поражает сайт (для требований кэша, определенных в атрибуте), существует меньше работы, которая будет сделана. Если существует только Образцовое кэширование, то даже при том, что логика (и скорее всего хит DB) кэшируется, веб-сервер все еще должен представить страницу. Почему делают это, когда результатом рендеринга всегда будет то же?

Поэтому запустите с OutputCachлуг, затем перейдите на Модель, кэширующуюся как Вы тест производительности Ваш сайт.

Кэширование вывода также намного более просто начаться с. Вы не должны волноваться о распределенном кэшировании веб-фермы probs (если Вы - часть фермы), и кэширующийся поставщик для модели.

Усовершенствованные методы кэширования

Можно также применить кэширование пончика-> кэш только часть страницы UI :) Проверьте его!

3
ответ дан 1 December 2019 в 23:49
поделиться

Все это зависит от того, насколько дорогой операция. При усложнении запросов затем, могло бы иметь смысл кэшировать данные на уровне контроллера так, чтобы запрос не был выполнен снова (пока кэш не истекает).

Следует иметь в виду, что кэширование является очень сложной темой. Существует много различных мест, что можно сохранить кэш:

  • Akamai / кэширование CDN
  • Кэширование браузера
  • Кэширование приложения в оперативной памяти
  • Объект Кэша.NET
  • Директива страницы
  • Распределенный кэш (memcached)
1
ответ дан 1 December 2019 в 23:49
поделиться

Я выбрал бы кэширование на образцовом уровне. (В целом совет, кажется, для уменьшения бизнес-логики на уровне контроллера и перемещении как можно больше в образцовые классы.)

Как насчет того, чтобы делать его как это:

У меня есть некоторые записи в модели, представленной классом Entry и источник записей (от базы данных, или 'множества пользовательских объектов'). В модели я делаю интерфейс для получения записей:

public interface IEntryHandler
{
    IEnumerable<Entry> GetEntries();
}

В модели у меня есть фактическая реализация IEntryHandler где записи считаны из кэша и записаны для кэширования.

public class EntryHandler : IEntryHandler
{
    public IEnumerable<Entry> GetEntries()
    {
        // Check if the objects are in the cache:
        List<Entry> entries = [Get entries from cache]
        if (entries == null)
        {
            // There were no entries in the cache, so we read them from the source:
            entries = [Get entries from database or 'plethora of custom objects']
            [Save the retrieved entries to cache for later use]
        }
        return entries;
    }
}

Контроллер затем звонил бы IEntryHandler:

public class HomeController : Controller
{
    private IEntryHandler _entryHandler;

    // The default constructor, using cache and database/custom objects
    public HomeController()
        : this(new EntryHandler())
    {
    }

    // This constructor allows us to unit test the controller 
    // by writing a test class that implements IEntryHandler
    // but does not affect cache or entries in the database/custom objects
    public HomeController(IEntryHandler entryHandler)
    {
        _entryHandler = entryHandler;
    }

    // This controller action returns a list of entries to the view:
    public ActionResult Index()
    {
        return View(_entryHandler.GetEntries());
    }
}

Таким образом, это возможно к модульному тесту контроллер, не касаясь реального кэша/базы данных/пользовательских объектов.

2
ответ дан 1 December 2019 в 23:49
поделиться
Другие вопросы по тегам:

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