【问题标题】:InRequestScope provider (for custom ViewEngine) only called once at appstartInRequestScope 提供程序(用于自定义 ViewEngine)仅在 appstart 时调用一次
【发布时间】:2011-10-28 15:15:40
【问题描述】:

我想将自定义 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() 来做到这一点,但这并没有什么区别。有谁知道怎么回事?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我正在为多租户网站尝试一些东西。我希望能够有不同的主题。所以每个租户都有自己的 CSS 和母版页。我认为检测每个请求的租户并使用它创建视图引擎是个好主意。
    【解决方案2】:

    与其注入自定义视图引擎,不如尝试使用Application_Start()

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

    当您以这种方式进行注册时会发生什么?有用吗?

    【讨论】:

    • 是的,这样的注册有效。但这并不完全是我想要的。我想刷新 ViewEngine 每个请求。我查看了 global_asax 方法,其中 BeginRequest 看起来最相关。但我想使用 Ninject 的依赖项,但无法从 global_asax 访问 Ninject 内核。
    • 我已经复制了您的问题,确实,CreateInstance 方法也只为我调用了一次。恐怕我不确定这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 2019-03-31
    • 2014-09-20
    相关资源
    最近更新 更多