Ich hatte vor ein paar Tagen die gleichen Bedenken, konnte aber in der Dokumentation nichts zu sealed traits
finden zum Modellieren von ADT in MongoDB.
Am Ende habe ich sealed class
verwendet wie im offiziell vorgeschlagen Scala-Treiber-GitHub-Repo
.
Wenn Sie wirklich Eigenschaften verwenden möchten (aufgrund der Definition abstrakter Methoden), können Sie Folgendes tun:
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)
}
Jetzt können Sie Ihr ADT für A mit sealed class
definieren lassen .
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
Diese Antwort löst die Frage nicht direkt, bietet jedoch eine praktikable Problemumgehung. Beachten Sie, dass dieser Code nur ein Beispiel ist. Eine vollständigere Implementierung finden Sie in diesem Github-Repo .