Имах същото безпокойство само преди няколко дни, но не намерих нищо в документацията относно sealed traits
за моделиране на ADT в MongoDB.
В крайна сметка използвах sealed class
както е предложено в официален scala драйвер github repo
.
Ако наистина искате да използвате характеристики (поради дефиницията на абстрактни методи), можете да направите нещо подобно:
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)
}
Сега можете да дефинирате своя ADT за A с 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
Този отговор не решава директно въпроса, но предоставя възможно заобиколно решение. Имайте предвид, че този код е само пример. За по-пълно внедряване можете да видите това репо на github .