2011-10-28 4 views
1

MVC 웹 사이트에 사용자 정의 ViewEngine을 주입하고 싶습니다. 이것은 내가 할 것입니다 :InRequestScope 공급자 (사용자 정의 ViewEngine 용)는 appstart에서 한 번만 호출됩니다.

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

오히려 그 대신 Application_Start()를 사용하여 시도해 볼 수도 있습니다, 사용자 정의보기 엔진을 주입 : 당신이 등록이 방법을 수행 할 때 어떻게됩니까

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

? 작동합니까?

+0

예, 등록이 작동합니다. 그러나 그것은 내가 원하는 것만은 아닙니다. ViewEngine을 모든 요청에 ​​새로 고침하고 싶습니다. BeginRequest가 가장 관련성이 높은 것으로 보이는 global_asax 메소드를 살펴 보았습니다. 하지만 Ninject의 의존성을 사용하고 싶습니다. global_asax의 Ninject Kernel을 사용할 수 없습니다. – user369117

+0

나는 당신의 문제를 복제했다. 실제로'CreateInstance' 메쏘드는 한번만 호출된다. 이것에 대해 나는 두려워. –

1

보기 엔진은이 경우 Ninject에 의해 캐시되지 않습니다. MVP 자체는 IDependencyResolver에서 매번 요청하지 않습니다. 하지만 이것이 올바른 행동이라고 생각합니다. 그렇게하면 뷰 엔진을 재사용함으로써 오버 헤드를 최소화 할 수 있습니다.

뷰 엔진에 요청 종속 종속성이 없어야합니다. 이러한 종류의 종속성은 뷰 모델에서 검색되어야하며 컨트롤러가 할당해야합니다.

그리고 InRequestScope를 제거해야합니다. 그렇지 않으면 첫 번째 요청 후에 Ninject에 의해 처리되지만 MVC는 여전히이를 다시 사용하려고 시도합니다.

+0

나는 멀티 테넌트 웹 사이트에 대해 몇 가지 것을 시도하고있다. 나는 다른 테마를 가질 수 있기를 원한다. 그래서 각 테넌트는 자신의 CSS와 마스터 페이지를 가지고 있습니다. 각 요청마다 테넌트를 감지하고 뷰 엔진을 만드는 것이 좋은 생각이라고 생각했습니다. – user369117