2012-05-09 33 views
11

RazorEngine.Razor.Compile()に電話すると、コンパイルされたテンプレートはどこに保存されますか?RazorEngineのテンプレートはどのようにキャッシュされていますか?

プログラムの再起動後に利用できますか?メモリ不足があれば、それは投げ捨てられますか?

ASP.NETMVC)プロジェクトではRazorEngineを使用しています。アプリケーションの再起動後にプリコンパイルされたテンプレートを利用できるようになりますか?

HttpContext.Cacheに保存する方が理にかなっていますか? これを実行した場合、内部キャッシュをバイパスする別の機能(Compile以外)を使用する方が理にかなっていますか? ITemplateを実行してモデルを渡す方法はありますか?

RazorEngine.Razor.Parse()はキャッシングを行いますか?または、毎回テンプレートが再コンパイルされていますか?

答えて

16

現在、RazorEngineはテンプレートをコンパイルした後、メモリにロードされます。これらのアセンブリはメモリ内でのみ保持され、アプリケーションの存続期間を超えて継続しません。

これらのアセンブリをファイルにコンパイルするためのサポートを追加することを検討していますが、将来のバージョンになります。

あなたがRazor.Parseを呼び出し、テンプレートの名前を渡すと

は、それが同じ名前を持つアセンブリのために、メモリ内のアセンブリのキャッシュをチェックし

  1. しようとします。
  2. 無効なテンプレートの内容のキャッシュが変更されました。
  3. 新しくコンパイルされたテンプレートをキャッシュします。
+0

私の質問にお答えしていただきありがとうございます。私はなぜこれを見たことがないのかわかりません。だから、もし私がRazor.Parseに名前を渡すだけで、テンプレートは同じ名前のRazor.Parseという前の時間と同じです。次に、新しいアセンブリを作成する代わりに、キャッシュされたアセンブリを使用しますか? – Rabbi

+0

@Rabbiはい、これは動作する方法です。テンプレートの名前を渡すと、テンプレートコンテンツのハッシュコードを取得し、動的にコンパイルされた型とともにメモリキャッシュに格納します。次に呼び出すときに、テンプレート文字列のハッシュコードが変更されていない場合、テンプレートタイプを自由にインスタンス化して実行することができます。そうでない場合は、キャッシュ内の既存のタイプを無効にして、新しいテンプレートの内容を基に再コンパイルします。 –

+3

参考までに、これは現在のRazorEngineでの動作ではありません。 Profillingは、Razor.Parseが各Web呼び出しで2秒の遅延を引き起こすことを示しました。それをRazor.GetTemplate()で切り替える。 Razor.Run();正しく私たちのキャッシュを引き起こした。 – KallDrexx

6

私は、これはRazorEngine 3.4.1.0で動作するようになった下旬2014

鍵は、その後、実行に安いRazor.Run(name, model)を呼び出してキャッシュにテンプレートを置くために、高価なRazor.Compile(content, name)を呼び出すことですがインストールしましたテンプレート。

テンプレートの内容を読むことは高価になることがあることに注意してください。たとえば、ディスクからの読み取りが必要な場合があります。これはあなたのためにキャッシュがあまりにも多いかもしれないので、慎重に!

私はカスタムTemplateBase<T>サブクラスの内部で使用するRenderPartialメソッドです。同じテンプレートへの複数の呼び出しで非常に迅速に実行されます。

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せずにそれを行っていることができませんでした - なぜ1つにアップ票を与えていない、あまりにも? :)


編集 - あなたはより細かい方法でキャッシングを実行する必要がある場合、あなたはRazorEngineTemplateServiceITemplateResolverを使用して別のアプローチを使用する必要があります。

ここにスターターコードがあります。

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をテンプレートの内容にテンプレート名を回すので、あなたが実装することができ、例えば。

+0

アプリを再起動せずにキャッシュを無効にするにはどうすればよいですか? –

+1

このソリューションはあなたのためにそれをしません、私は恐れています。私は、RazorEngine.Templating.ITemplateResolverクラスを使ってテンプレートの内容を取得する独自の小さなシステムを作成しなければなりませんでした。私はこれが正しい道に沿ってあなたを助ける場合、私の答えの一番下にいくつかの初心者コードを追加しました。 –

+0

キャッシュを無効にして即座に再コンパイルするには、ファイルウォッチャーをディスク上のテンプレートに配置する必要がありますか?すでに何かが組み込まれているのですか、それとも自分自身を転がす必要がありますか? – crush

関連する問題