无法将 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
。
假设这是在接受 some
、parameters
的某些 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
我正在尝试使用 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
。
假设这是在接受 some
、parameters
的某些 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