मैं इस RazorEngine 3.4.1.0 के साथ काम मिल गया है, देर से जनवरी 2014
कुंजी महंगा Razor.Compile(content, name)
कॉल करने के लिए कैश में टेम्पलेट डाल करने के लिए है, तो सस्ते Razor.Run(name, model)
फोन पर अमल करने के लिए स्थापित नमूना।
याद रखें कि टेम्पलेट सामग्री पढ़ना महंगा हो सकता है - कहें, डिस्क से पढ़ने को शामिल करना - इसलिए मेरा समाधान केवल एक बार टेम्पलेट सामग्री प्राप्त करता है। यह आपके लिए बहुत अधिक कैशिंग हो सकता है, इसलिए सावधान रहें!
यहां RenderPartial
विधि है जिसका उपयोग मैं कस्टम TemplateBase<T>
सबक्लास के अंदर करता हूं। यह एक ही टेम्पलेट पर एकाधिक कॉल के लिए बहुत तेज़ी से चलता है।
public abstract class SqlTemplate<T>: TemplateBase<T>
{
public string RenderPartial(string templateName, object model = null)
{
// loading a template might be expensive, so be careful to cache content
if (Razor.Resolve(templateName) == null)
{
// we've never seen this template before, so compile it and stick it in cache.
var templateContent = GetTemplateContent(templateName);
Razor.Compile(templateContent, templateName);
}
// by now, we know we've got a the template cached and ready to run; this is fast
var renderedContent = Razor.Run(templateName, model);
return renderedContent;
}
private string GetTemplateContent(string templateName)
{
... your implementation here
}
}
तुम भी RazorEngineConfigurator.Configure()
को फोन करके इस आधार वर्ग (SqlTempalte<T>)
जो आप इस तरह कर सकते हैं, उपयोग करने के लिए रेजर बताने के लिए की जरूरत है;
public static class RazorEngineConfigurator
{
private static bool configured = false;
public static void Configure()
{
if (configured)
{
return;
}
var templateConfig = new TemplateServiceConfiguration
{
BaseTemplateType = typeof(SqlTemplate<>),
EncodedStringFactory = new RazorEngine.Text.RawStringFactory()
};
RazorEngine.Razor.SetTemplateService(new TemplateService(templateConfig));
configured = true;
}
}
this SO answer के बिना यह नहीं कर सकते थे - क्यों एक अप-वोट भी नहीं दे कि एक? :)
संपादित करें - आप ज़्यादा व्यापक रास्ते में कैशिंग प्रदर्शन करने की जरूरत है, तो आप RazorEngineTemplateService
और ITemplateResolver
का उपयोग कर एक अलग दृष्टिकोण का उपयोग करना होगा।
स्टार्टर कोड का एक टुकड़ा यहां है;
public static RazorEngineTemplateService CreateService(ITemplateResolver resolver, ICollection<string> namespaces)
{
Check.IsNotNull(resolver, "resolver");
var config = new TemplateServiceConfiguration();
config.BaseTemplateType = typeof(PlainTextTemplate<>);
config.EncodedStringFactory = new RazorEngine.Text.RawStringFactory();
config.Resolver = resolver;
config.Namespaces = new HashSet<string>(namespaces);
var service = new RazorEngineTemplateService(config);
return service;
}
ITemplateResolver
,, टेम्पलेट सामग्री में टेम्पलेट नाम देता है ताकि आप, लागू कर सकते हैं जैसे एक CachedFileTemplateResolver
जो डिस्क से कैश की गई सामग्री लोड करता है।
मेरे प्रश्न का उत्तर देने के लिए बहुत बहुत धन्यवाद। मुझे नहीं पता कि मैंने कभी यह क्यों नहीं देखा। तो अगर और केवल अगर मैं रेजर को नाम पास करता हूं। पर्स और टेम्पलेट पिछले समय के समान है जिसे मैंने रेजर कहा था। उसी नाम के साथ पर्स। फिर यह एक नया निर्माण करने के बजाय कैश असेंबली का उपयोग करेगा? – Rabbi
@ रब्बी हां, यह इस तरह काम करता है। टेम्पलेट के नाम पर गुजरते समय, हम टेम्पलेट सामग्री के हैशकोड को पकड़ते हैं और गतिशील रूप से संकलित प्रकार के साथ मेमोरी कैश में स्टोर करते हैं। अगली बार जब आप इसे कॉल करते हैं, तो टेम्पलेट स्ट्रिंग का हैशकोड नहीं बदला है, तो हम टेम्पलेट प्रकार को तुरंत चालू कर सकते हैं और इसे निष्पादित कर सकते हैं। यदि नहीं, तो हम मौजूदा प्रकार को कैश में अमान्य कर देते हैं और नई टेम्पलेट सामग्री पर आधार को पुन: संकलित करते हैं। –
एफवाईआई, यह नहीं है कि यह वर्तमान RazorEngine में कैसे काम करता है। प्रोफाइलिंग ने रेजर को दिखाया। पर्स ने प्रत्येक वेब कॉल में 2 सेकंड देरी की। इसे Razor.GetTemplate() के साथ स्विच करना; Razor.Run(); सही ढंग से हमारे लिए कैशिंग ट्रिगर किया। – KallDrexx