在大型应用程序中指定路由的最佳实践

Best practice for specifying the routing in a big application

我对长颈鹿很陌生。

假设我们有一个包含很多模块和页面(即数十个网页和成百上千个 Web api 操作)的大型应用程序,在不造成混乱的情况下指定路由的最佳方法是什么?

例如,我们有这些业务模块(假设我们可以将它们映射到具有相同名称的子文件夹):

这里的路由示例是简约的:https://github.com/giraffe-fsharp/Giraffe/blob/master/DOCUMENTATION.md#routing。通常,应用程序可以有很大的路由表。我假设我们必须为每个模块都有一个子路径。

谢谢

我不知道 "best practices" 在社区中讨论过(如果我是你,我也会去 F# Slack 并在 #web 频道开始讨论这个话题)但我通常坚持从特定于模块的路由器组成应用程序路由。

在顶层,我倾向于使用非常通用的路由(错误路由、OIDC 注销等)以及顶层模块路由器

let webApp =
    choose [
        route "/error" >=> handleError
        route "/logout" >=> logout
        moduleARoutes
        moduleBRoutes
    ]

模块路由可能如下所示

let moduleARoutes : HttpHandler =
    subRoute "/api/moduleA"
        authorize >=> choose [
            GET >=>
                choose [
                    routef "/%O" handleGet
                    routef "/%O/things" handleGetThings
                ]

            POST >=>
                choose [
                    routef "/%O" handleCreate
                    routef "/%O/things" handleThingCreation
                ]

            subModuleA1Routes
        ]

moduleARoutes处于同一级别的子模块和其他模块的完成方式完全相同。

您唯一需要非常小心的是在何处编写处理授权和身份验证等特殊处理的 Web 部件。我个人喜欢在顶级模块的基础上处理它,但这是非常有品位和用例特定的。

总而言之,使用 Giraffe 路由定义,您有很多自由和选择 - 一切都是完全可组合的。一个警告可能是性能 - 我不完全确定您的路由设计(尤其是在您描述的大型应用程序中)如何影响端点解析。我会相应地进行实验、测量和调整。