Ik had dezelfde bezorgdheid een paar dagen geleden, maar ik vond niets in de documentatie over sealed traits
voor het modelleren van ADT in MongoDB.
Uiteindelijk gebruikte ik sealed class
zoals gesuggereerd in de officiële scala driver github repo
.
Als je echt eigenschappen wilt gebruiken (vanwege de definitie van abstracte methoden), kun je zoiets als dit doen:
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)
}
Nu kunt u uw ADT voor A laten definiëren met 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
Dit antwoord lost de vraag niet direct op, maar biedt een haalbare oplossing. Merk op dat deze code slechts een voorbeeld is. Voor een meer complete implementatie kun je deze github-repo bekijken .