如何优雅地从数据库初始化 Scala 服务?

How to elegantly initialize a Scala service from a database?

我已经离开 Scala 有一段时间了,所以我正在努力回到习语中。我有三个数据库调用:

db.getInventory(inventoryId: UUID): Future[Option[Inventory]]
db.getInventoryFields(inventoryId: UUID): Future[Seq[InventoryField]]
db.allInputs: Future[Seq[Input]]

如果 db.getInventorySome(inventory),我想通过给它一个

来初始化我的服务
CacheContext(inventory: Inventory, fields: Seq[InventoryField], inputs: Seq[Input])

但是如果是None,我想报错,return。

在这里使用 for/map/flatMap/fold 等的最佳组合是什么?

这将 return 一个 Future[Option[CacheContext]]

for {
  optInv  <- db.getInventory(theUuid)
  invFlds <- db.getInventoryFields(theUuid)
  inputs  <- db.allInputs
} yield optInv.map(CacheContext(_,invFlds,inputs))

解包 Future(即等待)应该在代码的后面完成(如果有的话),此时您可以 .fold() 覆盖 Option 并报告错误.