我对NancyFX很陌生并正在研究它的功能。我试图弄清楚的是,是否有可能使用多个模块(从NancyModule
派生的类)组成一个大型站点,从而可以从多个模块定义构建路径。
例如,我有以下模块,AbcModule
:
public class AbcModule : NancyModule
{
public AbcModule() : base("/api/systems/abc")
{
Get["/"] = _ => "ABC API Host";
Get["/domains/"] = _ => Response.AsJson(Domains.All);
Get["/domains/{name}"] = x => Response.AsJson(Domains.All.Single(y => x.Name == y.Name));
}
}
我不想要的是暴露“api / systems / abc”。我希望在另一个定义“api / systems”的模块(即RootModule
)中定义此路径,并在运行时构建可用系统列表。然后AbcModule
不知道它的容器定义了相对于某个URL的所有路由。
NancyFX可以吗?
更新即可。让我举个例子(我很乐意承认我误解了一些东西,在这种情况下请告诉我哪里有缺陷)。有一个Web服务将公开可能大量的服务或插件集合。每个插件都负责自己的资源类型和资源结构,但为什么要知道它的容器的路由规则呢?想象一下,开发人员正在使用包含在Nancy MusicModule中的插件“music”来定义路径“/ rock”,“/ metal”和“disco”。但是在生产机器上,他的代码部署在一个网站中,MusicModule成为定义“音乐”,“体育”和“电影”路线的“爱好”服务的一部分。最后,有一个定义“api”路由的根模块。
所以这里有一个问题:MusicModule只能处理属于其域的路由,其余的完整路径由其他模块添加,因此在只有MusicModule可用的开发机器上可以使用“rock”资源直接在localhost:xxx / rock访问,在生产机器上它从其他(链接)模块公开,所以访问路径是machinename:xxx / api / hobby / music / rock?
如果这是一个坏主意,请详细说明原因。从模块中隐藏完整的路径路径会出现什么问题?
答案 0 :(得分:2)
您要求的是在不同的根网址上运行,其中/api/systems/
不是您的应用程序的一部分,而是您的托管环境。南希不了解全局根路径的概念。通过拦截传入的请求(使用应用程序级别的Before挂钩)并重写传入URL的URL,可以非常轻松地完成此操作。