【发布时间】:2017-04-04 22:35:58
【问题描述】:
我们使用蛋糕模式来抽象带有自类型注释的组件(DB、Mock),这些组件在顶层调用中被注入。
在一种情况下,我们希望能够通过扩展共同特征来丰富其行为。但是如果我们想让这个case类调用一个抽象组件怎么办呢? 将案例类重构为抽象类将删除所有应用、取消应用、复制的实现......我们需要在数据库和模型之间进行映射(例如使用 Slick)。
这是一个将植物表示为帐户拥有的资源的块的示例:
trait Resource {
def getAccount: Future[Account]
}
case class Account(id: Int)
case class Block(id: Int, name:String, accountId: Int) extends Resource
case class Plant(id: Int, name: String, blockId: Int) extends Resource {
this: PlantDBComponent =>
override def getAccount: Future[Account] = plantDB.getAccount(this)
}
trait PlantDBComponent {
def plantDB: PlantDB
trait PlantDB {
def getAccount(plant: Plant): Future[Account]
}
}
trait SlickPlantDBComponent {
def blockDB = SlickPlantDB()
trait SlickPlantDB extends PlantDB {
def getAccount(block: Block): Future[Account] = {
val q = for {
block <- BlockTable if block.id === plant.blockId
account <- AccountTable if account.id === block.accountId
} yield account
db.run(q.result.head)
}
}
}
知道如何在不重新实现所有案例类样板的情况下做到这一点吗?在具有案例类模式匹配的 Resource 伴随对象中添加 getAccount 并不能解决问题
【问题讨论】:
-
用代码告诉我你想要实现什么
-
为什么要把
Account变成Resource? -
添加更具体的代码示例。 Resource 是用于权限访问的通用特征。用户(此处未显示)属于一个帐户,如果用户与使用 getAccount 方法的资源属于同一帐户,我们想要检查所有类型的资源(块、工厂、...)
标签: scala design-patterns slick-3.0