mlu*_*iak 7 c# f# redis c#-to-f# servicestack
今晚我和F#和redis一起玩.我正在使用ServiceStack.redis连接到在localhost上运行的MSOpenTech redis.出于测试目的,我试图用这样的代码将比特币的价格保存到redis中:
let redis = new RedisClient("localhost")
redis.FlushAll()
let redisBitstamp = redis.As<BitstampLast>()
let last = {Id = redisBitstamp.GetNextSequence(); Timestamp = 1386459953; Value=714.33M}
redisBitstamp.Store(last)
let allValues = redisBitstamp.GetAll()
allValues.PrintDump()
Run Code Online (Sandbox Code Playgroud)
不幸的是,PrintDump的结果是:
[
{
__type: "Program+BitstampLast, RedisSave",
Id: 0,
Timestamp: 0,
Value: 0
}
]
Run Code Online (Sandbox Code Playgroud)
出于测试目的,我在同一个redis实例上的C#中运行了几乎相同的代码:
class BitstampLast
{
public Int64 Id { get; set; }
public int Timestamp { get; set; }
public decimal Value { get; set; }
}
class Program
{
static void Main(string[] args)
{
var redis = new RedisClient("localhost");
redis.FlushAll();
var redisBitstamp = redis.As<BitstampLast>();
var last = new BitstampLast() {Id = redisBitstamp.GetNextSequence(), Timestamp = 1386459953, Value=714.33M};
redisBitstamp.Store(last);
var allValues = redisBitstamp.GetAll();
allValues.PrintDump();
}
}
Run Code Online (Sandbox Code Playgroud)
结果......
[
{
__type: "CSharpRedis.BitstampLast, CSharpRedis",
Id: 1,
Timestamp: 1386459953,
Value: 714.33
}
]
Run Code Online (Sandbox Code Playgroud)
那么,我错过了什么?为什么它在C#中工作,而在F#中不起作用?
编辑:BitstampLast的定义方式如下:
type BitstampLast = {Id:int64; Timestamp:int; Value:decimal}
Run Code Online (Sandbox Code Playgroud)
这是错的,因为它应该是:
type BitstampLast = {mutable Id:int64; mutable Timestamp:int; mutable Value:decimal}
Run Code Online (Sandbox Code Playgroud)
现在它有效.接下来的问题 - 为什么它应该是可变的?redis有些混乱了这个对象吗?
myt*_*thz 14
许多ServiceStack的库(例如,序列化,自动映射等)都在POCO上工作,这些POCO具有默认构造函数和可写属性,F#immutable record默认情况下没有这些属性.
在F#中创建POCO的最好方法是使用CLIMutable属性F#3.0语言功能来装饰它,该属性创建一个POCO类型,其中包含可在C#代码中访问的所有属性的公共getter和setter,但仍然在F#中表现为不可变类型,例如:
[<CLIMutable>]
type BitstampLast = { Id:int64; Timestamp:int; Value:decimal }
Run Code Online (Sandbox Code Playgroud)