f# redis servicestack datacontract mutable

F#MĂșltiples atributos CLIMutable DataContract



redis servicestack (1)

Me encuentro con un problema al combinar atributos cuando utilizo ServiceStack.Redis con f #. Tal vez estoy pensando en esto, pero ahora me gustaría que mi tipo se separe a JSON, pero también pasable a ServicvStack. El problema con los tipos de f # es que no hay un constructor predeterminado, y los datos agregados a mi instancia de Redis son emtpy, bueno, el registro está ahí, pero ninguno de los datos que contiene está ahí.

Aquí hay un ejemplo:

open System open ServiceStack.Redis [<CLIMutable>] [<DataContract>] type Car = { [<field: DataMember(Name="ID")>] ID : int64 [<field: DataMember(Name="Make")>] Make : string [<field: DataMember(Name="Model")>] Model : string } let redisCar = redis.As<Car>() let redisAddCar car : Car = let redisCar = redis.As<Car>() redisCar.Store({ car with ID = redisCar.GetNextSequence() }) let car1 = redisAddCar { ID = 0L; Make = "Honda"; Model = "Accord LX" } let car2 = redisAddCar { ID = 0L; Make = "Honda"; Model = "Accord EX" } let car3 = redisAddCar { ID = 0L; Make = "Honda"; Model = "Accord SX" } let cars = redisCar.GetAll() cars |> Seq.iter (fun car -> printfn "ID: %i, Make: %s, Model: %s" car.ID car.Make car.Model)

Esto se imprimirá:

ID: 0, Make: , Model: ID: 0, Make: , Model: ID: 0, Make: , Model:

Sin embargo, si cambio el tipo a este:

[<CLIMutable>] [<DataContract>] type Car = { [<field: DataMember(Name="ID")>] mutable ID : int64 [<field: DataMember(Name="Make")>] mutable Make : string [<field: DataMember(Name="Model")>] mutable Model : string }

Luego imprimirá:

ID: 1, Make: Honda, Model: Accord LX ID: 2, Make: Honda, Model: Accord EX ID: 3, Make: Honda, Model: Accord SX

¿Por qué tengo que agregar mutable a cada propiedad incluso si se definió a través del atributo? Preferiría que no fuera mutable, ya que no quiero que cambie el estado. Tal vez estoy pensando demasiado en esto y debería simplemente hacer un nuevo tipo y traducir el tipo inmutable al tipo mutable para que pueda ser consumido con ServiceStack.Redis.


CLIMutable atributo CLIMutable no afecta el comportamiento del registro cuando se utiliza el registro desde el código F #. Para el código F #, sigue siendo un registro inmutable. Vea aquí: http://blogs.msdn.com/b/fsharpteam/archive/2012/07/19/more-about-fsharp-3.0-language-features.aspx

"En F # 3.0, hemos agregado CLIMutableAttribute. Si asocia este atributo a un tipo de registro F #, entonces el compilador F # emite un constructor predeterminado y establecedores de propiedades en el IL generado para este tipo (aunque esas características no están expuestas al código F # ). "