2

我有一些数据源需要在事务中包装操作,这有两种可能的结果:成功和失败。这种方法引入了相当多的样板代码。我想做的是这样的(失败也是如此(@txFailure可能是这样)):

@txSuccess(dataSource)
def writeData(data: Data*) {
  dataSource.write(data)
}

宏注释在哪里@txSuccess,处理后将导致:

def writeData(data: Data*) {
  val tx = dataSource.openTransaction()

  dataSource.write(data)

  tx.success()
  tx.close()
}

正如你所看到的,这种方法非常有用,因为在这个例子中,75% 的代码可以被删除,因为它是样板。

那可能吗?如果是的话,你能给我一个正确的方向吗?如果没有,您可以推荐什么来实现这样的目标?

4

1 回答 1

0

It's definitely possible, but you don't necessarily need macros for the task.

Here's a simple solution, which doesn't use macros

object DataOperation {
  def withTransation[T](dataSource: DataSource)(f: () => T): T = {
    val tx = dataSource.openTransation()
    f()
    tx.success()
    tx.close()
  }
}

And use it like

DataOperation.withTransation(dataSource) {
  dataSource.write(data)
}
于 2014-08-20T14:55:59.850 回答