我想将自定义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()做到这一点,但这没有任何区别。有谁知道发生了什么事?
答案 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);
}
以这种方式进行注册会发生什么?它有效吗?