Поставщик InRequestScope (для пользовательского ViewEngine) вызывается только один раз при запуске приложения - PullRequest
1 голос
/ 28 октября 2011

Я хочу добавить пользовательский 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 ]

1 голос
/ 28 октября 2011

В этом случае Ninject не кэширует движок представления. Сам MVC не каждый раз запрашивает его у IDependencyResolver. Но я думаю, что это правильное поведение. Таким образом, это минимизирует затраты на создание движка представления путем его повторного использования.

Вы не должны иметь зависимую от запроса зависимость в вашем движке представления. Этот вид зависимости должен быть извлечен из модели представления и назначен контроллером.

И вы должны удалить InRequestScope. В противном случае он будет удален Ninject после первого запроса, но MVC все равно попытается использовать его повторно.

0 голосов
/ 28 октября 2011

Вместо того, чтобы вводить пользовательский механизм просмотра, вы можете попробовать использовать Application_Start() вместо:

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

Что происходит, когда вы делаете регистрацию таким образом? Это работает?

...