Tuve la misma preocupación hace solo unos días, pero no encontré nada en la documentación con respecto a sealed traits
para modelar ADT en MongoDB.
Al final, usé sealed class
como se sugiere en el oficial repositorio de github del controlador scala
.
Si realmente quiere usar rasgos (debido a la definición de métodos abstractos), puede hacer algo como esto:
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)
}
Ahora puede tener su ADT para A definido con 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
Esta respuesta no resuelve la pregunta directamente, pero proporciona una solución viable. Tenga en cuenta que este código es solo un ejemplo. Para una implementación más completa, puede ver este repositorio de github .