2013-12-08 13 views
7

Tôi đang chơi tối nay với F # và redis. Tôi đang sử dụng ServiceStack.redis để kết nối với MSOpenTech redis chạy trên localhost. Đối với một mục đích thử nghiệm tôi đã cố gắng để tiết kiệm giá Bitcoin vào redis với mã như thế này:ServiceStack.Redis with F # không lưu trữ dữ liệu. Nhưng gần như cùng một mã trong C# hoạt động

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

Thật không may, kết quả từ PrintDump là:

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

Chỉ cần cho mục đích thử nghiệm, tôi chạy gần như giống hệt mã trong C# trên cùng dụ 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(); 

    } 
} 

Và kết quả ...

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

Vì vậy, tôi đang thiếu gì? Tại sao nó hoạt động trong C# và không có trong F #?

EDIT: BitstampLast được định nghĩa như vậy:

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

đó là sai, bởi vì nó nên là:

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

Và bây giờ nó hoạt động. Câu hỏi tiếp theo sau đó - tại sao nó nên được thay đổi? Có redis somewehow mess với đối tượng này?

+2

Bạn đã xác định 'BitstampLast' trong dự án F # của mình như thế nào? –

+0

Đây là gợi ý tuyệt vời. Tôi đã thay đổi thành mutable, bởi vì tôi thấy nó trên một số blog. Tôi rất muốn tìm hiểu thêm, tại sao điều này nên được đặt thành có thể thay đổi. – mlusiak

Trả lời

14

Nhiều thư viện của ServiceStack (ví dụ: Tự động hóa, ánh xạ tự động, v.v.) hoạt động trên POCO có hàm tạo mặc định và thuộc tính có thể ghi, trong đó F # bản ghi bất biến không có theo mặc định. Cách tốt nhất để tạo POCO trong F # là để trang trí nó với thuộc tính CLIMutableF# 3.0 Language Feature tạo kiểu POCO với getters và setters công khai cho tất cả các thuộc tính có thể truy cập trong mã C#, nhưng vẫn hoạt động như các kiểu bất biến trong F #, ví dụ: :

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

Cảm ơn bạn đã giải thích! Và cảm ơn tất cả các công việc tuyệt vời với ServiceStack :) – mlusiak

+0

@mlusiak np :-) – mythz

Các vấn đề liên quan