我正在写一个不应该保存任何东西的服务。它有一些价值。查看数据库中的一些内容,然后咳嗽回复。有什么办法可以让服务更快/更少开销吗?还有什么是传递它的最好方法。我通常会传递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与传递对象的优势,劣势或标准是什么?鉴于我不打算在服务中保存任何内容,这是否会发生变化?我有什么明显的错误吗?你对这个头衔有更好的建议吗?
答案 0 :(得分:2)
你问过很多问题,应该把它分成几个问题。但我会解决整个问题 - 这种方法一般都很好。
启动和提交不执行任何数据库持久性的事务没有太多开销,但这很浪费,所以你应该添加
static transactional = false
在这种情况下,您将该类用作易于注入的单例辅助类。在服务中进行交易工作很方便,因为它们是自动交易的,但它远非要求。
但有一件事 - 不在服务中使用闭包。它们在控制器和标签库中是必需的(无论如何都要到2.0),但在服务和其他类中应始终避免使用它们。如果你没有使用它是一个闭包的事实 - 即将它作为参数传递给方法作为参数,或者设置它的委托等等 - 那么你只是太过时髦了。如果你像一个方法一样调用它,那就把它变成一个方法吧。服务关闭的真正缺点是,当你希望它们是交易时,它们不可能。这是因为Spring拦截器拦截方法调用,而不是Groovy假装的闭包调用是方法调用。因此,不会对交易,安全等进行任何拦截。