Grails - 如何传递域对象和使用服务

时间:2011-07-14 21:50:53

标签: grails transactions

我正在写一个不应该保存任何东西的服务。它有一些价值。查看数据库中的一些内容,然后咳嗽回复。有什么办法可以让服务更快/更少开销吗?还有什么是传递它的最好方法。我通常会传递id并再次获取它;是好/坏/笨蛋?

例如

class DoStuffController {
  def ExampleProcessingService
  def yesDoIt = {
    def lookup = "findme"
    def theObject = ExampleThing.findByLookie(lookup)
    def lolMap = ExampleProcessingService.doYourThing(theObject.id)
    if(lolMap["successBool"]){
      theObject.imaString = "Stuff"
      theObject.save()
    }
    []
  }
}

服务

class ExampleProcessingService{
  static transactional = true //???????? false? not-a?
  def doYourThing = {theID ->
    def returnMap = [:]
    def myInstance = ExampleThing.get(theID)
    if(myInstance.something)returnMap.put "successBool", true
    else returnMap.put "successBool", false
    return returnMap
  }
}

域对象

class ExampleThing {

  String imaString
  String lookie
  static constraints = {
    imaString(nullable:true)

  }
  def getSomething() {
    return true
  }
}

自举

import learngrails.*
class BootStrap {

    def init = { servletContext ->
        def newThing = new ExampleThing(lookie:"findme")
        newThing.save()
    }
    def destroy = {
    } 
}

传递ID并执行get与传递对象的优势,劣势或标准是什么?鉴于我不打算在服务中保存任何内容,这是否会发生变化?我有什么明显的错误吗?你对这个头衔有更好的建议吗?

1 个答案:

答案 0 :(得分:2)

你问过很多问题,应该把它分成几个问题。但我会解决整个问题 - 这种方法一般都很好。

启动和提交不执行任何数据库持久性的事务没有太多开销,但这很浪费,所以你应该添加

static transactional = false

在这种情况下,您将该类用作易于注入的单例辅助类。在服务中进行交易工作很方便,因为它们是自动交易的,但它远非要求。

但有一件事 - 在服务中使用闭包。它们在控制器和标签库中是必需的(无论如何都要到2.0),但在服务和其他类中应始终避免使用它们。如果你没有使用它是一个闭包的事实 - 即将它作为参数传递给方法作为参数,或者设置它的委托等等 - 那么你只是太过时髦了。如果你像一个方法一样调用它,那就把它变成一个方法吧。服务关闭的真正缺点是,当你希望它们是交易时,它们不可能。这是因为Spring拦截器拦截方法调用,而不是Groovy假装的闭包调用是方法调用。因此,不会对交易,安全等进行任何拦截。