MVC3 с сотнями тысяч макетов / шаблонов - PullRequest
1 голос
/ 14 марта 2012

У меня есть приложение, в котором каждый пользователь может выбрать свой макет.Макеты могут быть разными, и это не только стили CSS, но и HTML.

Я знаю, что mvc будет кэшировать макет, но, имея так много макетов, я сомневаюсь, что он поместится в кэш.Так что было бы лучше сохранить шаблоны в БД или на диске?

К вашему сведению: БД, которую я использую, это MongoDB.

1 Ответ

1 голос
/ 14 марта 2012

Я бы сохранил макеты на диске, потому что на данный момент я не вижу никаких преимуществ в базе данных (если вы этого не сделаете). Но стоит упомянуть одну вещь: вы можете создать класс, производный от OutputCacheAttribute , и ваш сохраненный результат будет зависеть от используемого вами макета.

Зависит ли макет от пользователя? Вы можете использовать свойство VaryByCustom , чтобы оно варьировалось в зависимости от пользователя.

EDIT

Разрешено ли вашим пользователям динамически изменять макеты? Если да, у вас также должен быть гид, связанный с вашими пользователями, который будет меняться каждый раз при изменении макетов, поэтому вы возвращаетесь к своему методу VaryByCustom:

return string.Format("User-{0}-{1}", user.Id, user.LayoutUpdateGuid);

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

Как применить атрибут VaryByCustom в вашей ситуации

В своем методе действий вы можете использовать:

[OutputCache(Duration = 3600, VaryByCustom = "UserLayouts")]
public ActionResult Details(string param)
{
   // Returning the view
}

Затем в вашем методе VaryByCustom в файле Global.asax.cs:

protected override string VaryByCustom(string custom)
{
  switch (custom)
  {
    case "UserLayouts":
      //// Here you fetch your user details so you can return a unique
      //// string for each user and "publishing cycle" 
      //// Also, I strongly suggest you cache this user object and expire it
      //// whenever the user is changed (e.g. when the LayoutUpdateGuid is
      //// changed) so you achieve maximum speed and not defeat the purpose
      //// of using output cache.
      return string.Format("User-{0}-{1}", user.Id, user.LayoutUpdateGuid);
    break;
  }
}

Недостающий кусок

Недостающий элемент здесь заключается в том, что вам нужно сохранить значение, которое я назвал LayoutUpdateGuid (я уверен, вы найдете более подходящее имя), и изменять это значение всякий раз, когда пользователь изменяет свои макеты => это приведет к Строка, возвращаемая методом VaryByCustom (string) в Global.asasx.cs, что, в свою очередь, заставит ваш метод действия выполнить снова и вернуть результат с обновленным макетом.

имеет для вас смысл?

Примечание: я не могу проверить конкретный код, который я написал здесь, но я уверен (кроме опечаток), что он правильный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...