gpt4 book ai didi

scala - Slick Repo 方法都参与一个服务的事务

转载 作者:行者123 更新时间:2023-12-04 08:34:02 25 4
gpt4 key购买 nike

我目前有一组以约定命名的数据访问对象 *SlickRepo .例如,UserSlickRepo , DistributionSlickRepo , ContentSlickRepo , 等等...

这些 Repos 中的每一个都有基本遵循此约定的方法:

trait SomethingRepoImpl extends SomethingRepo {
val somethingRepo: SomethingRepo = new SomethingRepoImpl

class SomethingRepoImpl extends SomethingRepo with MySlickDatastore {

def getSomething(id: UUID): Either[SomethingNotFoundError, Something] = {
getDatabase withDynSession {
// Slick stuff
}
}
def createSomething .....
}
}

现在在服务级别,我们在这个 repo 类中烘焙,我们有如下所示的方法:
trait SomethingServiceImpl extends SomethingService {

dep: SomethingRepo with SomethingElseRepo =>


val somethingService = new SomethingServiceImpl

class SomethingServiceImpl extends SomethingService {

def createSomethingGood(): Either[SomeError, (Something, SomethingElse)] = {
(dep.somethingRepo.createSomething, dep.somethingElseRepo.createSomethingElse)
}

}
}

我们现在渴望拥有 createSomethingGood实际上在一个事务中运行两个 repo 方法。由于所有 Slick 的东西都被锁定在 Slick 特定的 Repo 方法中,那么最好的方法是什么?我不反对在我的 *ServiceImpl 中使用 Slick 特定的代码类(我的意思是奇怪,但可以),但这是否意味着我必须更改我的 Repo 类以删除 getDatabase withDynSession一起输入代码,然后从服务层传入一个 session ?对我来说,这似乎……错了。

最佳答案

从我的角度来看,正确的方法是添加 createSomethingcreateSomethingElse到一个 *Repo ( SomethingRepoSomethingElseRepo )事务方法( withTransaction {...} )。这不是一个漂亮的解决方案,但对我来说尽可能简单,因为这些实体在逻辑上是相连的(我们可以从这个代码中看到 (dep.somethingRepo.createSomething, dep.somethingElseRepo.createSomethingElse) )我认为在一个 DAO 类中混合对 2 个实体的操作并不是一个很大的违规行为。如果我错了,请纠正我。

关于scala - Slick Repo 方法都参与一个服务的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30987335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com