2016-11-02 68 views
0

我们有一种情况,我们的应用程序有许多模块实现api。这些模块中的每一个都有一个依赖关系,依赖关系取决于正确配置的数据目录路径。在配置路径之前,不应构建这些模块。动态注册和取消注册Nancy路线/模块

我们还有一个模块,用于实现配置的设置和验证,包括配置上述路径。

我们想以某种方式'禁用'数据模块,直到配置可以被确认。例如,在启动时我们检查数据目录是否存在并且是有效的。另外,当用户通过配置模块保存更改时,我们会再次进行确认。回顾一下,用户设置数据目录,然后数据模块全部启用。当用户设置一个无效的数据目录(或者我们启动并且现有的目录无效),模块全部被禁用。

我们尝试在pipelines.BeforeRequest上注册处理程序,但它没有帮助。实际上,我们实际上失败了,当南希实例化我们的模块作为填充RouteCache的一部分时。我们需要阻止这个实例化,直到我们确认我们已经配置好了。

看来我们应该可以说“当某些条件为真时使用这组模块,并且当条件为假时使用这个其他组。南希人怎么会这样呢?

回答

0

如果所有这些模块你是指实现相同的API(即定义了同一套Method + Pattern + Action处理程序),那么也许你应该只使用一个模块来处理所有他们的请求,并使用在模块模式中捕获段变量(例如"/{path}/api/operation/")以确定您所指的是哪个路径(即数据目录)。

然后,在行动的主体中,您可以检查您所需要的条件是否得到满足。事情是这样的:

Get["/app/{directory}/api/status"] = parameters => { 
    var dataDirectory = parameters.directory; 
    // Do whatever condition checks you need with the dataDirectory value 
    // and return the appropriate HTTP status code if they are not met, 
    // otherwise continue handling the request 
    return HttpStatus.OK; 
} 

另一种方法是(如果再次使用一个单独的模块来处理所有这些请求)使用自定义路线参数约束(见https://github.com/NancyFx/Nancy/wiki/Defining-routes#custom-constraints)。 在这种情况下,如果您的条件未得到满足,路线将根本不会被击中。