Jag hade samma oro för bara några dagar sedan men hittade ingenting i dokumentationen angående sealed traits
för modellering av ADT i MongoDB.
Till slut använde jag sealed class
som föreslås i den officiella scala drivrutin github repo
.
Om du verkligen vill använda egenskaper (på grund av definitionen av abstrakta metoder) kan du göra något så här:
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 för A definierad 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
Det här svaret löser inte frågan direkt men ger en möjlig lösning. Observera att den här koden bara är ett exempel. För en mer komplett implementering kan du se denna github-repo .