我有一个相当典型的Nancy配置,视图是从文件系统上的位置提供的。
在特定路线下,我希望提供未存储在文件系统中的视图,但将以外部服务的Markdown格式提供。
我最初通过考虑为IViewLocationProvider
创建自定义具体类来解决这个问题,该类将处理从外部服务查找视图的问题。通过我对Nancy的理解(我可能在这里错了),你只能有一个IViewLocationProvider
,所以添加这个自定义类意味着我无法获得其余页面(对于我所有的其他路径)文件系统。
我现在的方法是手动调用Nancy.ViewEngines.Markdown.Render
方法,将其传递给Markdown(封装在Func<TextReader>
中)和假ViewLocationResult
。如此:
public class MyModule
{
public MyModule(ExternalServiceAdapter externalService, MarkDownViewEngine viewEngine, IRenderContext renderContext) : base("/MyPath")
{
Get["/{Name}/{Version}/View"] = parameters => SpecialView(viewEngine, renderContext, externalService, (string)parameters.Name, (string)parameters.Version);
}
protected static Response SpecialView(MarkDownViewEngine viewEngine, IRenderContext renderContext, ExternalServiceAdapter externalService, string name, string version)
{
var contents = externalService.GetData(name, version);
var location = new ViewLocationResult(string.Empty, string.Empty, "md", contents);
return viewEngine.RenderView(location, null, renderContext); //FIXME fails when performing Master page substitution in Super Simple View Engine
}
}
不幸的是,Markdown包含一个SSVE @Master['master']
标记,该标记会导致上述内容在指定行下降,并且在SSVE内部具有空引用异常。 (我在文件系统上有一个名为 master 的文件,并且在Nancy的视图默认路径约定中 - 但我认为不存在导致问题的文件)
有没有更好的方法从markdown渲染Nancy视图,而不是位于文件系统上? (但为其他路由维护文件系统提供程序)