我有一些数据源需要在事务中进行包装操作,这有两种可能的结果:成功和失败。这种方法引入了很多样板代码。我想做的是这样的事情(对于失败也是如此(类似@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%的代码可以被删除,因为它是样板文件。
这可能吗?如果是的话,你能给我一个正确方向吗?如果不是,为了达到这样的目的,你能推荐什么?
答案 0 :(得分:0)
这绝对是可能的,但您不一定需要宏来完成任务。
这是一个简单的解决方案,它不使用宏
object DataOperation {
def withTransation[T](dataSource: DataSource)(f: () => T): T = {
val tx = dataSource.openTransation()
f()
tx.success()
tx.close()
}
}
并像
一样使用它DataOperation.withTransation(dataSource) {
dataSource.write(data)
}