Giraffe是一種用于構建Web應用的微型F# Web框架。它基于ASP.NET Core,為Web框架提供了F# API。Giraffe支持開發人員在使用F#構建Web應用的同時,還可以訪問ASP.NET Core及其生態系統所提供的特性。
Giraffe的語法類似于另一種廣為使用的Web框架Suave。兩者間相似性為我們提出了一個問題:兩種框架是否應該合二為一,或是應該遵循同一套API。Giraffe的創立者闡述了他認為合并不能產生增值的理由:
正如人們經常提及的,Giraffe的根本出發點在于提供與ASP.NET Core的緊密集成,這是Giraffw和Suave間的一個主要差異所在。我們注意到,在使用功能性.NET開發構建功能性ASP.NET Core Web應用上存在著利基空間。Giraffe的推出正是力圖填補這一空缺。它在ASP.NET Core之上構建了一個輕量級功能層,同時依然保持DI、HttpRequest、HttpResponse、Config等ASP.NET Core構建塊可用。這使得F#開發人員可以使用已有的(或是即將推出的)許多ASP.NET Core生態系統。
Giraffe的主要構件是HttpHandler。HttpHandler提供了一種函數流水線,它類似于通過IApplicationBuilder組合使用ASP.NET Core。一個Handler可以通過調用隨后的Handler,繼續流水線的處理。例如:
type HttpHandler = HttpFunc -> HttpContext -> HttpFuncResultGiraffe使用了組合(Combinator)方法。開發人員可以通過將HttpHandlers組合在一起創建更高層級的抽象,最終創建一個應用。例如:
let webApp =choose [route “/foo” >=> text “Foo”route “/bar” >=> text “Bar”]type Startup() =member __.Configure (app : IApplicationBuilder) (env : IHostingEnvironment) (loggerFactory : ILoggerFactory) = app.UseGiraffe webAppGiraffe中使用的是.NET的Task對象,而非異步(async)工作流。這兩種實現是不同的,需要做相互轉化。Giraffe通過最小化這種轉化,降低了開銷。
let personHandler = fun (next : HttpFunc) (ctx : HttpContext) -> task { let! person = ctx.BindModel例子應用提供在GitHub上。
查看英文原文: ASP.NET Core and F# with Giraffe