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

时间:2014-10-23 22:35:04

标签: f# owin

我正在尝试在F#中创建下面的示例类(取自here)。

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");
    }
}

但是,我在使用典型的.NET类型和典型的F#类型进行转换以及使用F#异步工作流来实现C#等待发生的事情时都很困难。

1 个答案:

答案 0 :(得分:6)

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

this question开始,我将使用此函数绑定来等待没有返回值的任务:

let awaitTask = Async.AwaitIAsyncResult >> Async.Ignore 

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

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