如何在F#中定义一个owin中间件类?

Sha*_*tin 2 f# owin

我试图在F#中创建下面的示例类(取自此处).

public class LoggingMiddleware
{
    private AppFunc next;

    public LoggingMiddleware(Func<IDictionary<string, object>, Task> next)
    {
        this.next = next;
    }

    public async Task Invoke(IDictionary<string, object> environment)
    {
        Console.WriteLine("Begin Request");
        await next.Invoke(environment);
        Console.WriteLine("End Request");
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我正在努力在典型的.NET类型和典型的F#类型之间进行转换,并使用F#async工作流来实现C#await所发生的事情.

Chr*_*son 6

F#异步工作流和.Net任务的最大(当前)问题是没有直接类比Task没有返回类型的问题.

这个问题,我将使用此函数绑定来等待没有返回值的任务:

let awaitTask = Async.AwaitIAsyncResult >> Async.Ignore 
Run Code Online (Sandbox Code Playgroud)

有了它,您可以直接将您的示例类翻译为:

type FSharpMiddleware(next: Func<IDictionary<string,obj>, Task>) =

    member this.Invoke (environment: IDictionary<string,obj>) : Task =
        async {
            printfn "Begin Request"
            do!
                awaitTask <| next.Invoke environment
            printfn "End Request"
        } |> Async.StartAsTask :> Task
Run Code Online (Sandbox Code Playgroud)