Miałem ten sam problem zaledwie kilka dni temu, ale nie znalazłem niczego w dokumentacji dotyczącej sealed traits
do modelowania ADT w MongoDB.
W końcu użyłem sealed class
zgodnie z sugestią w oficjalnym repozytorium github sterownika scala
.
Jeśli naprawdę chcesz używać cech (ze względu na definicję 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 zdefiniować ADT dla A 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 bezpośrednio pytania, ale zapewnia możliwe obejście problemu. Zauważ, że ten kod jest tylko przykładem. Aby uzyskać pełniejszą implementację, możesz zobaczyć to repozytorium github .