2011-10-28 15 views
1

MVC WebサイトにカスタムViewEngineを注入したいとします。これは私が何をすべきかです:InRequestScopeプロバイダ(カスタムViewEngine用)は、appstartで一度しか呼び出されません

private static IKernel CreateKernel() 
{ 
    kernel.Bind<IViewEngine>().ToProvider(new RazorViewEngineProvider()).InRequestScope(); 
} 

これは私のプロバイダです:

public class RazorViewEngineProvider : Provider<RazorViewEngine> 
{ 
    protected override RazorViewEngine CreateInstance(IContext context) 
    { 
     return new RazorViewEngine(); 
    } 
} 

問題がある:私が初めてWebサイトにアクセスしたときに私のプロバイダは一度だけ呼ばれます。次回、私のプロバイダは何とかキャッシュに残っています。それは私が望むものではありません。

すべてのリクエストでプロバイダを実行したい。私はそれをInRequestScope()で行うことができると考えましたが、それは何の違いもありません。誰が何が起こっているのか分かっていますか?むしろ、その後

答えて

0

カスタムビューエンジンを注入し、あなたの代わりにApplication_Start()を使用して試みることができる:

protected void Application_Start() 
{ 
    ViewEngines.Engines.Clear(); 
    ViewEngines.Engines.Add(new RazorViewEngineProvider()); 
    RegisterRoutes(RouteTable.Routes); 
} 

をあなたは登録をこの方法で行うとどうなりますかそれは動作しますか?

+0

はい、そのような登録が動作します。しかし、それは私が欲しいものではありません。 ViewEngineをリクエストごとに更新したい。私は、global_asaxメソッドを見てきました。そのうちのBeginRequestが最も関連性が高いと思われます。しかし、私はNinjectの依存関係を使いたいと思います.Global_asaxからNinject Kernelにアクセスすることはできません。 – user369117

+0

私はあなたの問題を再現しました。実際、 'CreateInstance'メソッドは一度だけ呼び出されます。これについて私は恐れているとは分かりません。 –

1

この場合、ビューエンジンはNinjectによってキャッシュされません。 IDependencyResolverから毎回要求しないMVC自体です。しかし、私はこれが正しい行動だと思う。そうすれば、ビューエンジンを再利用することによって最小限のビューエンジンを作成するオーバーヘッドが維持されます。

ビューエンジンに依存する依存関係はありません。この種の依存関係は、ビューモデルから取得され、コントローラによって割り当てられる必要があります。

InRequestScopeを削除する必要があります。それ以外の場合は、最初のリクエスト後にNinjectによって処理されますが、MVCはそれを再利用しようとします。

+0

私は複数テナントのウェブサイトにいくつかのことを試みています。私は異なるテーマを持つことができるようにしたい。だから各テナントはそれ自身のCSSとマスターページを持っています。私は、それぞれのリクエストでテナントを検出し、ビューエンジンを作成することをお勧めします。 – user369117