我正在使用Suave构建经过身份验证的Web API,我经常偶然发现在不同功能中聚合信息的问题
pathScan Navigation.playersAvailables GetGame >>= getInSession >>= (fun (gameId,playerInSession) -> //access to both gameId and player in session)
签名:
getGame : HttpContext -> Async<HttpContext option>
getInSession : HttpContext -> Async<HttpContext option>
为了做到这一点,我发现的唯一一件事就是在userDataDictionnary中存储信息:
Writers.setUserData "player" { playerId= playersId; socialId=socialId; username = username}
要在另一个函数中检索它,但它对我来说看起来很讨厌:
let player = x.userState.["player"] :?> PlayerSession
//do some other stuff now that we have the current player
还有另一种方法吗?我想拥有像这样的纯粹功能 getGameId并获取Session等等。并且能够组合它们,因为我希望处理我的不同路线:
pathScan Navigation.playersAvailables GetGame >>= getInSession >>= (fun (gameId,playerInSession) -> //access to both gameId and player in session)
pathScan Navigation.otherRoute GetGame >>= (fun (gameId) -> //process gameId)
pathScan Navigation.otherRoute2 getInSession >>= (fun (sessionId) -> //process sessionId to do some other stuff)
我担心我需要的是与一些真正的函数程序员进行一天的交谈..
答案 0 :(得分:0)
setUserData
是一个纯函数-src。
不确定this是否仍然是最新的,但是它表示pathScan
和>>=
不能很好地链接。不过,我认为您使用的Writers.setUserData
可能可以完成它。
使用提包将东西拉出来不是很可爱。
怎么样:
let (|ParseInt|_|) =
function
| "" | null -> None
| x ->
match Int32.TryParse x with
| true, i -> Some i
| _ -> None
let (|HasParam|_|) name (ctx:HttpContext) =
ctx.request.queryParam name
|> function
|Choice1Of2 value ->
Some value
| _ -> None
let playersAvailablePart:WebPart =
function
//access to both gameId and player in session
|HasParam "inSession" playerInSession & HasParam "gameId" gameId as ctx ->
// do your processing here, sample return:
OK "we had all the required important parts" ctx
// or an example of something more strongly typed
| HasParam "inSession" (ParseInt playerInSession) & HasParam "gameId" (ParseInt gameId) as ctx ->
// do your processing here, sample return:
OK "we had all the required important parts" ctx
| ctx -> never ctx
如果值不在queryParameters中,这将无法正常工作,但是您可以将其调整为适合它们的位置