Comment sont les modèles dans RazorEngine mis en cache?
Lorsque vous appelez RazorEngine.Razor.Compile()
, où est le modèle compilé stockées?
Est-il disponible après les programmes d'été redémarré? Si il y a un manque de mémoire, qu'il sera l'objet de dumping?
Je suis en utilisant RazorEngine
dans un ASP.NET (MVC) du projet. Va précompilé modèles sont disponibles qu'après le redémarrage de l'application?
Serait-il plus logique pour moi de les stocker dans la HttpContext.Cache
?
Si je le faisais, alors serait-il plus logique d'utiliser une fonction différente (autre que Compile
) qui contourne le cache interne? Est-il un moyen pour exécuter une ITemplate
et juste passer à un modèle?
Ne RazorEngine.Razor.Parse()
faire toute la mise en cache? Ou est le modèle recompilé à chaque fois?
OriginalL'auteur Rabbi | 2012-05-09
Vous devez vous connecter pour publier un commentaire.
Actuellement, après la RazorEngine compile les modèles, ils sont chargés en mémoire. Ces assemblées persistent dans la mémoire et ne pas continuer au-delà de la durée de vie de l'application.
Je suis envisage d'ajouter à l'appui de la compilation de ces assemblées de fichiers, mais ce sera une version future.
Si vous appelez
Razor.Parse
et passez dans un nom pour le modèle, il va tenter deOui, c'est la façon dont il fonctionne. Lors du passage dans un nom de modèle, nous prenons le hashcode du contenu du modèle et de la stocker dans la mémoire cache à côté de la type compilé dynamiquement. La prochaine fois que vous l'appelez, si le hashcode de la chaîne de modèle n'a pas changé, nous pouvons librement instancier le modèle type et de l'exécuter. Si non, nous invalider le type existant dans le cache et recompiler base sur le nouveau modèle de contenu.
Pour info, ce n'est pas la façon dont il fonctionne dans le courant RazorEngine. Profilling a montré de Rasoir.Analyser causer de 2 secondes de retard à chaque appel web. La commutation avec un Rasoir.GetTemplate(); Lame De Rasoir.Run(); correctement déclenché la mise en cache pour nous.
Pouvez-vous donner un exemple de votre appel
Razor.Parse
?L'astuce est d'appeler Compile() une fois, puis Exécuter() plusieurs fois, pas de Parse(). Parse() était cher, mais le Run() est bon marché.
OriginalL'auteur Matthew Abbott
J'ai à travailler avec RazorEngine 3.4.1.0, installé fin janvier 2014.
La clé est d'appeler le cher
Razor.Compile(content, name)
de mettre le modèle dans le cache, puis d'appeler le bon marchéRazor.Run(name, model)
pour exécuter le modèle.Rappelez-vous que la lecture d'un modèle de contenu peut être coûteux-dire impliquant une lecture à partir du disque -- si ma solution ne reçoit que le contenu du modèle une fois. Cela peut être trop la mise en cache pour vous, donc attention!
Voici la
RenderPartial
méthode que j'utilise à l'intérieur d'un personnaliséTemplateBase<T>
sous-classe. Il court très vite pour de multiples appels pour le même modèle.Vous devez également indiquer Rasoir pour l'utilisation de cette classe de base
(SqlTempalte<T>)
qui vous pouvez faire comme ceci, en appelantRazorEngineConfigurator.Configure()
;Ne pourrait pas le faire sans cette SORTE de réponse -- pourquoi ne pas donner que l'une d'un vote, trop? 🙂
Modifier - Si vous devez effectuer la mise en cache d'une façon plus précise, vous aurez besoin d'utiliser une approche différente à l'aide de
RazorEngineTemplateService
etITemplateResolver
.Voici un morceau de démarreur code;
ITemplateResolver
transforme les noms de modèle en modèle de contenu, de sorte que vous pouvez mettre en œuvre, par exemple, unCachedFileTemplateResolver
qui charge le contenu mis en cache sur le disque.Cette solution ne va pas le faire pour vous, je le crains. J'ai dû créer mon propre petit système pour ce qui utilise le RazorEngine.La création de modèles.ITemplateResolver classe pour obtenir un modèle de contenu. J'ai ajouté un peu de starter code en bas de ma réponse dans le cas où cela vous aide à vous le long de la voie de droite.
Donc, ne vous avez besoin de mettre filewatchers sur les modèles à disque à invalider le cache et les recompiler à la volée? Est-il rien de construit, déjà, ou dois-je rouler moi-même?
C'est une assez vieille réponse et je sais que les interfaces ont changé. Autant que je me souvienne c'était pour v2.4.2 (réel suppose!) mais si rien n'a changé dans ce domaine, alors vous pouvez utiliser un fichier de l'observateur ou simplement vérifier la date de dernière modification du fichier avant de le servir, de retour d'un modèle. IIRC le gros hit de l'analyse du modèle, pas de chargement, mais les caractéristiques de performance de votre application va vous suggérer la bonne approche.
OriginalL'auteur Steve Cooper