无法将 LazyCache 与 Suave 的 WebPart 一起使用

Failing to use LazyCache with Suave's WebPart

我正在尝试使用 LazyCache (https://github.com/alastairtree/LazyCache) 来缓存一些 API 请求。

代码如下:

let private cache = CachingService()
let doAPIStuff some parameters : WebPart = ...

let result = cache.GetOrAdd(hashedRequest, (fun _ -> doAPIStuff))

但是我得到这个编译错误:

  WebAPI.fs(59, 17): [FS0041] No overloads match for method 'GetOrAdd'.
Known types of arguments: string * ('a -> WebPart)
Available overloads:
 - (extension) IAppCache.GetOrAdd<'T>(key: string, addItemFactory: Func<'T>) : 'T // Argument 'addItemFactory' doesn't match
 - CachingService.GetOrAdd<'T>(key: string, addItemFactory: Func<Extensions.Caching.Memory.ICacheEntry,'T>) : 'T // Argument 'addItemFactory' doesn't match

这些是可用的类型:

所以我能做到:

let doAPIStuff some parameters : Object = ...

并装箱我的 WebPart,它工作正常。我知道 WebPart 是一个函数(感谢 Fyodor 在另一个问题中提出),但我不明白为什么函数本身不能作为对象存在于缓存中。

我认为在这种情况下您需要显式创建 Func 委托,否则 F# 编译器无法区分这两个重载。

第二个参数的类型(在基本情况下)是 Func<'T> 即函数接受 unit 并返回要缓存的值。这也意味着,在此函数内,您应该使用参数作为参数调用 doAPIStuff

假设这是在接受 someparameters 的某些 actualRequest 处理程序中,以下应该有效:

let cache = CachingService()

let doAPIStuff some parameters : WebPart = 
  failwith "!"

let actualRequest some parameters = 
  let hashedRequest = some + parameters
  let result = 
    cache.GetOrAdd(hashedRequest, 
      Func<_>(fun () -> doAPIStuff some parameters))
  result