2014-02-28 32 views
1

我对NancyFX非常陌生,并且在研究它的功能。我试图弄清楚的一件事是,是否可以使用多个模块(衍生自NancyModule的类)组合一个大型站点,以便可以从多个模块定义构建路由。NancyFX中的路由可以使用多个模块组成吗?

例如,我有以下模块,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 /系统/ ABC”。我希望此路径在另一个定义“api/systems”的模块(即RootModule)中定义,并在运行时构建可用系统列表。然后AbcModule不知道它的容器定义了它相对于某个URL的所有路由。

NancyFX可能吗?

UPDATE。让我给你一个例子(我承认我误解了一些东西,在这种情况下请告诉我缺陷在哪里)。有一个Web服务将会公开一个潜在的大量服务或插件。每个插件负责自己的资源类型和资源结构,但为什么它应该知道它的容器的路由规则?想象一下,开发者正在使用包含在Nancy MusicModule中的插件“music”来定义路线“/ rock”,“/ metal”和“disco”。但是在生产机器上,他的代码被部署在一个网站中,MusicModule成为定义“音乐”,“体育”和“电影”路线的“业余爱好”服务的一部分。最后,还有一个定义“api”路径的根模块。

所以,这里是一个问题:MusicModule只能处理属于它的域的路由,剩下的完整路径会被其他模块添加,所以在只有MusicModule可用的“摇滚”资源的开发机器上可以可以直接在localhost:xxx/rock上访问,在生产机器上可以从其他(链接)模块中获得,所以访问路径是machinename:xxx/api/hobby/music/rock?

如果这是一个坏主意,请详细说明原因。从模块隐藏完整的路径路径会出现什么问题?

+0

目前还不清楚你在问什么。你想有一个模块,动态“暴露”其他模块(及其路线)? – khellang

+0

是的,并且它们的路线路径被组合,例如, RootModule定义将由AbcModule管理的根“api/systems/abc”。但是AbcModule并不知道这个路径,它定义了路由“域”,因此客户端应用程序可以在“api/systems/abc/domain”访问它。 –

+0

这听起来像是在这里可怕地误解了一些东西......你可以用相关用例更新你的问题吗?为什么模块不知道自己的路径? – khellang

回答

2

你所要求的是运行在不同的根网址,其中/api/systems/不是你的应用程序的一部分,但你的主机环境。南希不理解全局根路径的概念。通过拦截传入请求(使用应用程序级别的Before钩子)并重写传入URL的URL,可以非常轻松地完成此操作。

+0

我明白了。我看到之前挂钩的例子,但我不知道没有其他(更透明)的配置方式。 感谢您的快速响应。 –

相关问题