2013-12-08 11 views
7

Sto giocando stasera con F # e redis. Sto usando ServiceStack.redis per connettermi a MSOpenTech redis in esecuzione su localhost. Per uno scopo di test che stavo cercando di salvare prezzo di bitcoin in Redis con codice come questo:ServiceStack.Redis con F # non memorizza i dati. Ma quasi lo stesso codice in C# funziona allo

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() 

Purtroppo, il risultato da PrintDump era:

[ 
    { 
      __type: "Program+BitstampLast, RedisSave", 
      Id: 0, 
      Timestamp: 0, 
      Value: 0 
    } 
] 

solo a scopo di test, mi sono imbattuto quasi identica codice in C# su stessa istanza Redis:

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(); 

    } 
} 

E il risultato ...

[ 
    { 
      __type: "CSharpRedis.BitstampLast, CSharpRedis", 
      Id: 1, 
      Timestamp: 1386459953, 
      Value: 714.33 
    } 
] 

Quindi, cosa mi manca? Perché funziona in C# e non in F #?

EDIT: BitstampLast è definita in questo modo:

type BitstampLast = {Id:int64; Timestamp:int; Value:decimal} 

che è sbagliato, perché dovrebbe essere:

type BitstampLast = {mutable Id:int64; mutable Timestamp:int; mutable Value:decimal} 

E ora funziona. Domande successive quindi - perché dovrebbe essere mutabile? Il redis somiglia in qualche modo a questo oggetto?

+2

Come hai definito 'BitstampLast' nel tuo progetto F #? –

+0

Questo è stato un ottimo suggerimento. Sono passato a mutabile, perché l'ho visto su alcuni blog. Mi piacerebbe saperne di più, perché questo dovrebbe essere impostato su mutabile. – mlusiak

risposta

14

Molte delle librerie di ServiceStack (ad esempio.Serializzazione, Auto-mappatura, ecc.) Funzionano su POCO che hanno un costruttore predefinito e proprietà scrivibili, che i record immutabili F # non hanno per impostazione predefinita.

Il modo migliore di creare di in F # è quella di decorare con l'attributo F# 3.0 Language FeatureCLIMutable che crea un tipo POCO con getter pubblici e setter per tutte le proprietà che sono accessibili in codice C#, ma ancora si comportano come tipi immutabili in F #, ad esempio POCO :

[<CLIMutable>] 
type BitstampLast = { Id:int64; Timestamp:int; Value:decimal } 
+0

Grazie per la spiegazione! E grazie per l'ottimo lavoro con ServiceStack :) – mlusiak

+0

@mlusiak np :-) – mythz