Tôi đã có cùng mối quan tâm chỉ vài ngày trước nhưng không tìm thấy bất kỳ điều gì trong tài liệu liên quan đến sealed traits
để lập mô hình ADT trong MongoDB.
Cuối cùng, tôi đã sử dụng sealed class
như được đề xuất trong chính thức đại diện github trình điều khiển scala
.
Nếu bạn thực sự muốn sử dụng các đặc điểm (do định nghĩa của các phương thức trừu tượng), bạn có thể làm như sau:
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)
}
Bây giờ bạn có thể có ADT của mình cho A được xác định với 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
Câu trả lời này không giải quyết trực tiếp câu hỏi nhưng cung cấp một giải pháp khả thi. Lưu ý rằng mã này chỉ là một ví dụ. Để triển khai đầy đủ hơn, bạn có thể xem repo github này .