0

我已经安装了 Topshelf.FSharp 包,这里有一个如何使用它的示例:

https://gist.github.com/haf/4252121

该示例的一部分定义了一个“Svc”(服务)类,如下所示:

type Svc() =
  member x.Start() =
    printfn "Started"
  member x.Stop() =
    printfn "Stopped"

使用 Owin selfhost,您可以调用各种静态重载之一IDisposable WebApp.Start(...)来启动 Web 服务器,然后将其处理以停止它。在C#中,如果要结合Topshelf和Owin,可以在调用Start()时将Start()的IDisposable结果存储在Svc类的私有本地字段中,然后在Stop()中对其调用Dispose() ) 方法。

在 F# 中,您可以使用“显式字段”( http://msdn.microsoft.com/en-us/library/dd469494.aspx )声明 IDisposable 类型的统一字段,但这似乎有些尴尬,有没有更好的方法?

4

2 回答 2

2

您不必使用显式字段来生成“未初始化”IDisposable值。例如,要定义可重新启动的服务,您可以使用这样的隐式webApp字段:

// Example 1: Using an implicit mutable IDisposable field.  
type Svc() =
    let mutable webApp = null

    member __.Start() = 
        if webApp = null then webApp <- WebApp.Start<Startup> "http://localhost:12345"

    member __.Stop() = 
        if webApp <> null then webApp.Dispose(); webApp <- null

// Example 2: Using an implicit mutable IDisposable option field.  
type Svc'() =
    let mutable webApp = None

    member __.Start() = 
        match webApp with 
            | Some _ -> () 
            | None -> webApp <- Some(WebApp.Start<Startup> "http://localhost:12345")

    member __.Stop() = 
        match webApp with 
            | Some webAppValue -> webAppValue.Dispose(); webApp <- None
            | None -> ()

如果服务不必重新启动,我会使用(不可变的)隐式惰性字段,正如@Tom 建议的那样。

于 2014-10-26T17:01:29.697 回答
1

您能否将成员Lazy<T> 改为 a 并在第一次访问时自动初始化它?在这种情况下,我不太确定 F# 的要求,即为什么这是一个问题,但对于延迟初始化,Lazy 似乎是一个不错的选择。

于 2014-10-26T13:59:43.337 回答