InRequestScope提供程序(用于自定义ViewEngine)仅在appstart处调用一次

时间:2011-10-28 15:15:41

标签: asp.net-mvc-3 ninject viewengine

我想将自定义ViewEngine注入我的MVC网站。这就是我的工作:

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();
    }
}

问题是:我第一次访问网站时,我的服务提供商只被调用一次。下次我的提供者仍然在缓存中。这不是我想要的。

我希望提供程序在每个请求上执行。我以为我可以用.InRequestScope()做到这一点,但这没有任何区别。有谁知道发生了什么事?

2 个答案:

答案 0 :(得分:1)

在这种情况下,Ninject不会缓存视图引擎。每次都是从IDependencyResolver请求它的MVC本身。但我认为这是正确的行为。这样,它可以通过重复使用来保持创建视图引擎的开销。

您的视图引擎中不应该有依赖于请求的依赖项。必须从视图模型中检索这种依赖关系,并且必须由控制器分配。

你应该删除InRequestScope。否则它将在第一次请求后由Ninject处理,但MVC仍会尝试重用它。

答案 1 :(得分:0)

而不是注入自定义视图引擎,您可以尝试使用Application_Start()代替:

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

以这种方式进行注册会发生什么?它有效吗?