使用Spark模板引擎时,防止在Nancy中进行视图缓存

时间:2014-04-16 00:14:02

标签: c# nancy spark-view-engine

我正在使用带有Spark模板的自托管Nancy。我已经专门禁用了缓存(尽管默认情况下应禁用DEBUG)。

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

        ...

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

但是,在应用程序运行时对模板进行更改似乎不起作用,因为模板更改未被选中。

是否还需要其他内容来禁用视图缓存?

2 个答案:

答案 0 :(得分:1)

由于您的应用程序是自托管的,因此我猜测您要么覆盖视图位置约定以在程序集中查找视图作为嵌入资源,要么已配置Visual Studio项目以在编译时将视图复制到输出目录中时间。在这两种情况下,您的应用程序都不会运行您在Visial Studio项目中的视图文件,而是关闭它们的副本。在这种情况下,缓存不是问题。

答案 1 :(得分: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的实例,它仅比较视图的上次更新时间,但在从{{1}调用this.lastUpdated之前更新时间戳IsStale()因此,模板从未从缓存中删除

DefaultViewCache