我有一个使用C# WebAPI
库的F#
应用程序。
F#
库的值为:
let mutable CurrentCustomer:Customer option = None
我也有:
let Customers:Map<string,Customer> option = None
Customers
和Customer
都是&#34;全局变量&#34;。启动时,C#
应用程序会将一组客户加载到此全局变量Customers
中。然后我有一个customersController
,其Post
调用F#函数setCurrentCustomer
,从CurrentCustomer
中存储的集合中设置全局变量Customers
: / p>
// Post in customersController:
public HttpResponseMessage Post(string identifier)
{
var _customer = FSharpLibrary.setCurrentCustomer(identifier);
// code
}
// setCurrentCustomer function:
let mutable CurrentCustomer:Customer option = None
let setCurrentCustomer() =
CurrentCustomer <- customer |> Some
CurrentCustomer
有没有办法通过更改CurrentCustomer
?
我知道我可以创建一个带有CurrentCustomer
对象的函数并返回一个新的CurrentCustomer
对象,但customersController
将如何知道当前客户设置为什么?
有没有办法避免使用这个全局可变变量Customer
?
答案 0 :(得分:4)
有没有办法通过更改CurrentCustomer来避免更改状态?
是的,有很多方法可以做到这一点,但大多数方法都涉及更改FSharpLibrary
的设计,以便它不依赖于可变状态。
作为一个完全一般的答案,您可以应用 State Monad ,但较少涉及的内容通常就足够了。但是,如果不知道你想要完成什么,那么这就不可能回答。
customersController
将如何知道当前客户的设置是什么?
它已经知道,因为它将当前客户设置为identifier
方法的Post
参数。该值在整个方法的范围内。
问题是为什么你的FSharpLibrary
有可变状态?你不能用纯函数实现它吗?