1

我想在服务方法中定义数据库调用,但让它们在Transaction类的上下文中执行,而不在服务本身中打开连接,这样我就可以在同一个事务中包含多个服务调用。

我正在寻找类似的东西,但无法完全弄清楚。

class Transaction {
  init { /** Grab connection **/ }

  fun doSelect() { ... }
}

class UserService {
  fun Transaction.getUser() {
    return doSelect()
  }
}

fun main (args: Array<String>) {
  Transaction() {
    UserService().getUser() // INVALID
    ...
  }
}

有没有办法做到这一点?

我知道我可以像这样将事务实例传递给服务:

class UserService(tx: Transaction) {
  fun getUser() {
    with(tx) {
      doSelect()
    }
  }
...

fun main (args: Array<String>) {
  Transaction() {
    UserService(this).getUser()
    ...
  }
}

...但我希望有一个更优雅的模式。

4

1 回答 1

0

系统以相反的方式工作,因此要解决此问题,请交换接收器:

fun main (args: Array<String>) {
    UserService().apply {
        Transaction().getUser() 
    }
}
于 2016-03-15T06:53:36.367 回答