Jeg havde den samme bekymring for blot et par dage siden, men fandt ikke noget i dokumentationen vedrørende sealed traits
til modellering af ADT i MongoDB.
Til sidst brugte jeg sealed class
som foreslået i den officielle scala driver github repo
.
Hvis du virkelig ønsker at bruge træk (på grund af definitionen af abstrakte metoder), kan du gøre noget som dette:
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 kan du få din ADT for A defineret med 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
Dette svar løser ikke spørgsmålet direkte, men giver en mulig løsning. Bemærk, at denne kode kun er et eksempel. For en mere komplet implementering kan du se denne github-repo .