2014-04-16 1 views
2

Spark 템플릿이있는 자체 호스팅 Nancy를 사용하고 있습니다. 나는 구체적으로 캐시를 비활성화했습니다 (비록 DEBUG가 기본적으로 비활성화되어 있어야합니다).Spark 템플릿 엔진을 사용할 때 Nancy의보기 캐싱을 방지합니다.

protected override void ApplicationStartup(Nancy.TinyIoc.TinyIoCContainer container, IPipelines pipelines) 
    { 
     base.ApplicationStartup(container, pipelines); 

     ... 

     StaticConfiguration.Caching.EnableRuntimeViewDiscovery = true; 
     StaticConfiguration.Caching.EnableRuntimeViewUpdates = true; 
    } 

그러나 앱이 템플릿 변경이 포착되지 않는 한, 작동하지 않는 것 실행되는 동안 템플릿 변경.

보기 캐싱을 사용 중지하려면 다른 것이 있습니까?

답변

1

가 좋아,이 부트 스트 래퍼에서 사용자 지정 ViewCache을 추가하여 작동하도록 관리 :

public class MyBootstrapper : DefaultNancyBootstrapper 
{ 
#if DEBUG 
    protected override IRootPathProvider RootPathProvider 
    { 
     get 
     { 
      // this sets the root folder to the VS project directory 
      // so that any template updates in VS will be picked up 
      return new MyPathProvider(); 
     } 
    } 

    protected override NancyInternalConfiguration InternalConfiguration 
    { 
     get 
     { 
      return NancyInternalConfiguration.WithOverrides(
       x => 
        { x.ViewCache = typeof(MyViewCache); }); 
     } 
    } 
#endif 

새로운 ViewCache 단지 모든 요청에 ​​템플릿을 다시로드 :

public class MyViewCache : IViewCache 
{ 
... 
    public TCompiledView GetOrAdd<TCompiledView>(
     ViewLocationResult viewLocationResult, Func<ViewLocationResult, TCompiledView> valueFactory) 
    { 
     //if (viewLocationResult.IsStale()) 
     // { 
       object old; 
       this.cache.TryRemove(viewLocationResult, out old); 
     // } 

     return (TCompiledView)this.cache.GetOrAdd(viewLocationResult, x => valueFactory(x)); 
    } 
} 

은 어떻게 든 viewLocationResult.IsStale()가되었다 항상 false을 반환합니다.

기본적으로

이 그냥보기의 마지막 업데이트 시간을 비교 FileSystemViewLocationResult의 인스턴스이지만, 타임 스탬프 this.lastUpdatedDefaultViewCache에서 IsStale()를 호출하기 전에 업데이트되고, 그래서 템플릿은 캐시에서 제거되지 않았다

public override bool IsStale() 
{ 
    return this.lastUpdated != this.fileSystem.GetLastModified(this.fileName); 
} 
+0

좋아 보이지만 완벽하지는 않습니다. FileSystemViewLocationResult를 어떻게 오버라이드합니까? –

1

응용 프로그램이기 때문에 어셈블리에서 임베디드 리소스로 뷰를 찾기 위해 뷰 위치 규칙을 재정의하거나 Visual Studio 프로젝트에서 뷰를 출력 디렉터리로 복사하도록 구성했습니다. 컴파일 시간. 두 경우 모두 Visia Studio 프로젝트에있는 뷰 파일에서 실행되는 것이 아니라 오히려 그 사본에서 벗어나 있습니다. 이 경우 캐싱이 문제가되지 않습니다.

+1

실제로'DEUBUG '에있을 때 VS 프로젝트를 가리 키기 위해 사용자 정의'IRootPathProvider'를 추가했습니다. 이 작품과 VS 프로젝트에서보기를 제공하지만 첫 번째 요청 후 캐시 된 것으로 보인다. 그 이후의 뷰에 대한 변경 사항 및 심지어 완전히 제거 된 변경 사항은 선택되지 않습니다. 언급을 잊어 버렸습니다. NuGet의'v0.22.2.0'을 사용하고 있습니다. –

관련 문제