我想注入一个自定义ViewEngine到我的MVC网站。我是这样做的:
private static IKernel CreateKernel()
{
kernel.Bind<IViewEngine>().ToProvider(new RazorViewEngineProvider()).InRequestScope();
}
This is my provider:
public class RazorViewEngineProvider : Provider<RazorViewEngine>
{
protected override RazorViewEngine CreateInstance(IContext context)
{
return new RazorViewEngine();
}
}
问题是:我的提供商只在我第一次访问网站时被调用一次。下次我的提供者不知何故仍在缓存中。这不是我想要的。
我希望提供程序对每个请求执行。我想我可以用。inrequestscope()做到这一点,但这没有任何区别。有人知道发生了什么吗?
在这种情况下视图引擎没有被Ninject缓存。不是MVC本身每次都从IDependencyResolver请求它。但我认为这是正确的行为。这样,通过重用它,它可以将创建视图引擎的开销降至最低。
你不应该在你的视图引擎中有一个请求依赖的依赖项。这种依赖关系必须从视图模型中检索,并且必须由控制器分配。
你应该删除InRequestScope。否则,它将在第一次请求后由Ninject处理,但MVC仍将尝试重用它。
而不是注入自定义视图引擎,你可以尝试使用Application_Start()
代替:
protected void Application_Start()
{
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngineProvider());
RegisterRoutes(RouteTable.Routes);
}
以这种方式注册会发生什么?它有用吗?