是否就 Nancy 的视图引擎达成共识?

Is there consensus on a view engine for Nancy?

得知 Nancy 有自己的 razor 实现,我有点吃惊,它的行为可能像也可能不像 razor。实际上,这会引起问题吗? "most people" 将什么用于 Nancy 视图引擎?为什么没有使用真正的剃须刀?

首先是简单的答案。到目前为止,Razor 引擎是 Nancy 下载次数最多的视图引擎 https://www.nuget.org/packages?q=nancy.viewengines

现在回答更复杂的问题

Why was the real razor not used?

因为 "real"(实际上我假设你指的是 ASP.NET 堆栈使用的引擎)Razor 引擎与内置于ASP.NET 堆栈(HttpContext 及其所有朋友),因此没有直接的方法将它与 Nancy 一起使用。

稍微长一点的答案是,您必须了解 Razor 实际上是一个解析器,而 Razor 视图引擎位于使用者和解析器的中间。

Nancy 使用 Razor 解析器,但我们必须拥有自己的视图引擎,因为这使 Nancy 能够解析和执行 Razor 模板。

现在,它确实变得更加复杂。您在 ASP.NET Razor 视图引擎中看到的许多功能,例如母版页、部分、各种帮助程序、_ViewStart 等,都不是 Razor(解析器)功能,但它们是一个附加功能集,具有已内置到视图引擎中(您几乎可以将其视为中间件)。

这意味着对于我们的引擎,我们必须重新实现其中的大部分功能,因为这是 Razor 视图引擎所期望的。

我想指出,如果可能的话,我们很乐意放弃自己的实现并使用 Microsoft 构建的实现(我们需要维护的代码更少,这意味着我们将支持 100 % 相同的功能集),但不幸的是,这不是我们的决定……恐怕我们不能依赖他们的抽象

希望这能解决问题

/A

我们使用 Nancy 的 Razor 实现已有一段时间了。我们 运行 遇到了一些问题,这些问题使我们要么转向 SSVE,要么放弃 Nancy(我们真的很喜欢 Nancy)。

Razor 的第一个问题是您不能像在 MVC 中那样预编译视图,这会导致启动时间更长。我们对此有很多抱怨。

第二个问题是 Nancy 的 Razor 实现中似乎存在一个长期存在的错误,导致只能通过回收应用程序池来解决的情况。我不是专家,但似乎在加载项目时,当时正在编译和生成一个临时 DLL(这解释了较慢的加载时间),但有时会出现无法创建实例的问题.它似乎在这个位置:https://github.com/NancyFx/Nancy/blob/master/src/Nancy.ViewEngines.Razor/RazorViewEngine.cs#L238。基本上 "viewAssembly.GetType("RazorOutput.RazorView")" 在不同时间都是 NULL,这会导致在每个页面上始终只为每个用户显示一条错误消息,解决它的唯一方法是重新加载application(回收应用程序池)

只是我的两分钱,我知道这个 post 比较旧,但也许其他人会看到我们 运行 遇到的一些问题。我已经打开了一个 GitHub 问题,但是这个错误对我们来说很难重现,而且它没有消失。