Ho provato tutte e 3 le librerie e ho trovato diverse differenze.
- RazorEngine - il più facile e funziona meglio tra tutti loro, supporta la memorizzazione nella cache per impostazione predefinita.
- RazorTemplates - non supporta alcune direttive Razor (ad esempio @model) e utilizza molti tipi di
dynamic
. Può usare modelli precompilati.
- RazorMachine - molto imprevedibile e con un design strano che richiede l'utilizzo di una singola istanza globale anziché di una classe statica.
Per quanto riguarda me, ho scelto RazorEngine. Anche qui è il codice come utilizzare queste librerie:
RazorEngine
string html = Razor.Parse(templateContent, model, templatePath);
RazorTemplates
if (!_templatesCache.ContainsKey(templatePath))
{
var compiledTemplate = Template.Compile(templateContent);
_templatesCache.Add(templatePath, compiledTemplate);
}
string html = _templatesCache[templatePath].Render(model);
RazorMachine
private readonly Lazy<RazorMachine> _lazyRazorMachine =
new Lazy<RazorMachine>(() => new RazorMachine());
//...
var rm = _lazyRazorMachine.Value;
string html = rm.ExecuteContent(templateContent, model, null, true).Result;
e alcuni test di performance, testato ogni libreria 2 volte sullo stesso modello, tutti hanno prestazioni simili, senza una grande differenza:
RazorEngine - 1731 ms, 0,1 ms
RazorTemplates - 1753 ms , 0,1 ms
RazorMachine - 1608 ms, 0,1 ms
Hai usato la stessa istanza dell'oggetto RazorMachine su più test? Questo dovrebbe essere un singleton a livello di app che gestisce tutta la memorizzazione nella cache e la precompilazione: https://github.com/jlamfers/RazorMachine/wiki/Examples –
@Chris Hynes Sì, il problema è stato risolto perché ho creato una nuova istanza ogni volta, ora ho risolto il codice. Anche se il fatto rimane, la biblioteca funziona in un modo molto inaspettato. – vorrtex
Come funziona RazorEngine con elementi avanzati come modelli, classi di visualizzazione personalizzate, layout, viewstarts, ecc.? RazorMachine, per quanto sia complicata, è l'unica cosa che ho trovato che funzioni effettivamente con l'intera gamma di funzionalità di Razor. Ho creato un paio di classi che funzionano con RazorMachine per fornire un ambiente simile a un rasoio completo con layout, viewstart, ecc., Ma in esecuzione in base a file di risorse incorporati. Questo mi consente di utilizzare gli stessi modelli da un progetto web, un progetto di servizio o ciò che hai. –