【发布时间】:2014-03-31 03:53:18
【问题描述】:
我们的应用在存储层之上有一个服务层——服务层方法将创建一个新的数据库会话(我们在 MySql 之上使用Slick)并将会话作为隐式参数传递给存储分层方法
trait Service1 {
def serviceLayerMethod(params) = {
db withSession {
implicit session: Session =>
storageLayerMethod1(params)
storageLayerMethod2(params)
}}}
object DAO1 {
def storageLayerMethod1(params)(implicit session: Session)
}
object DAO2 {
def storageLayerMethod2(params)(implicit session: Session)
}
我们希望能够从服务层向存储层注入不同的方法实现,例如我们有一个检索多条记录的multiGet 方法,我们希望这个方法有不同的实现例如一个并行执行multiGet,另一个尝试在从数据库中提取数据之前从 Redis 缓存中检索数据。我可以将这些方法作为隐式参数传递,但我希望有一种方法可以用更少的样板来做到这一点。
trait MultiGet {
def multiGet(params)(implicit session: Session)
}
object MultiGetDefault extends MultiGet
object MultiGetParallel extends MultiGet
object MultiGetCached extends Multiget
trait Servic1 {
def serviceLayerMethod1(params) = {
db withSession {
implicit session: Session =>
storageLayerMethod1(params)(MultiGetDefault)
}}
def serviceLayerMethod2(params) = {
db withSession {
implicit session: Session =>
storageLayerMethod1(params)(MultiGetParallel)
}}}
object DAO1 {
def storageLayerMethod1(params)(implicit session: Session, multiGetImpl: MultiGet) {
multiGetImpl.multiGet(params)
}}
大多数存储层方法都在单例对象中,因此我无法在不进行重大重构的情况下混合不同的MultiGet 实现。服务层特征正在通过蛋糕模式在控制器层实例化/注入。
【问题讨论】:
-
也许这个答案会满足您的需求:stackoverflow.com/questions/21965848/…
标签: scala dependency-injection slick