You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在F#中动态创建Func<>委托适配ASP.NET Core带参数路由

ASP.NET Core Minimal API F# 路由包装器适配路由参数方案

核心思路

ASP.NET Core Minimal API的MapGet方法支持根据路由模板自动绑定参数,我们可以通过重载泛型包装函数,适配不同参数数量(含/不含HttpContext)的F#处理函数,让路由定义更符合F#惯用的管道风格。

实现重载的mapGet函数

通过定义多组泛型重载,覆盖无参数、单个参数、多个参数(含/不含HttpContext)的场景:

open Microsoft.AspNetCore.Builder
open Microsoft.AspNetCore.Http
open System

// 无参数,无HttpContext
let mapGet<'TReturn> pattern (func: unit -> 'TReturn) (app: WebApplication) =
    app.MapGet(pattern, Func<'TReturn>(func))

// 单个路由参数,无HttpContext
let mapGet<'TParam, 'TReturn> pattern (func: 'TParam -> 'TReturn) (app: WebApplication) =
    app.MapGet(pattern, Func<'TParam, 'TReturn>(func))

// 单个路由参数,带HttpContext
let mapGet<'TParam, 'TReturn> pattern (func: HttpContext -> 'TParam -> 'TReturn) (app: WebApplication) =
    app.MapGet(pattern, Func<HttpContext, 'TParam, 'TReturn>(func))

// 两个路由参数,无HttpContext
let mapGet<'T1, 'T2, 'TReturn> pattern (func: 'T1 -> 'T2 -> 'TReturn) (app: WebApplication) =
    app.MapGet(pattern, Func<'T1, 'T2, 'TReturn>(func))

// 两个路由参数,带HttpContext
let mapGet<'T1, 'T2, 'TReturn> pattern (func: HttpContext -> 'T1 -> 'T2 -> 'TReturn) (app: WebApplication) =
    app.MapGet(pattern, Func<HttpContext, 'T1, 'T2, 'TReturn>(func))

使用示例

1. 无参数端点

app |> mapGet "/" (fun () -> "Hello World!")

2. 单个int路由参数(不含HttpContext)

app |> mapGet "/api/item/{id:int}" (fun id -> $"获取到ID为{id}的项目")

3. 单个int路由参数(含HttpContext)

app |> mapGet "/api/item/{id:int}" (fun ctx id -> 
    $"从路径{ctx.Request.Path}获取到ID为{id}的项目")

4. 多参数端点(int + Guid)

app |> mapGet "/api/{categoryId:int}/item/{itemId:guid}" (fun categoryId itemId -> 
    $"分类ID:{categoryId},项目ID:{itemId}")

关键说明

  • F#的类型推断会自动识别参数类型和返回值类型,大部分场景下可以省略泛型参数声明(如mapGet<int, string>可简化为mapGet)。
  • 若需要支持更多路由参数,只需添加对应参数数量的重载函数即可,泛型参数会自动匹配路由模板中的类型约束(如{id:int}对应int类型参数)。
  • 包装函数本质是将F#函数转换为C#兼容的Func委托,让ASP.NET Core的参数绑定机制正常工作。

内容的提问来源于stack exchange,提问作者ShNeoteric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 18:43:25