/ / Kodek sterownika Mongodb scala dla klas cech i dziedziczonych - mongodb, scala

Kodek sterownika Mongodb scala dla cech i dziedziczonych klas - mongodb, scala

Korzystanie z poniższych kierowca-mongo. Chcę wstawić i pobrać struktury (patrz poniżej) z MongoDB.

 trait A {
def id: ObjectId
}

case class B(id: ObjectId) extends A

case class C(id: ObjectId, name: String) extends A

Znajduję rozwiązanie przy użyciu zapieczętowanych klas, ale chcę używać cech. Chcę znaleźć rozwiązanie z kodekami lub czymś innym.

Odpowiedzi:

2 dla odpowiedzi № 1

Kilka dni temu miałem ten sam problem, ale nie znalazłem w dokumentacji niczego sealed traits do modelowania ADT w MongoDB.

W końcu użyłem sealed class jak sugerowano w oficjalny sterownik scala github repo.

Jeśli naprawdę chcesz używać cech (z powodu definicji metod abstrakcyjnych), możesz zrobić coś takiego:

package example.model

import example.model.adt._
import org.mongodb.scala.bson.ObjectId
import org.mongodb.scala.bson.codecs.Macros._
import org.mongodb.scala.bson.codecs.DEFAULT_CODEC_REGISTRY
import org.bson.codecs.configuration.CodecRegistries.{fromProviders, fromRegistries}

trait MongoModel {
def _id: ObjectId
}

object MongoModel {
val codecRegistery = fromRegisteries(fromProviders(classOf[A]), DEFAULT_CODEC_REGISTRY)
}

Teraz możesz mieć swój ADT dla A zdefiniowany za pomocą sealed class.

package example.model.adt

import example.model.MongoModel
import org.mongodb.scala.bson.ObjectId

sealed class A

final case class B(_id: ObjectId) extends A with MongoModel
final case class C(_id: ObjectId) extends A with MongoModel

Ta odpowiedź nie rozwiązuje pytania bezpośrednio, ale zapewnia możliwe obejście. Zauważ, że ten kod jest tylko przykładem. to repozytorium github.