Grails - как передавать доменные объекты и пользоваться услугами - PullRequest
0 голосов
/ 15 июля 2011

Я пишу сервис, который не должен ничего сохранять. Он получает некоторые значения. Просматривает несколько вещей в базе данных, а затем выкашливает ответ. Что я должен сделать, чтобы сделать сервис быстрее / меньше накладных расходов? Также, каков лучший способ передать это кое-что. Я обычно передаю идентификатор и получаю его снова; это хорошо / плохо / глупо?

пример

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
  }
}

1012 * самозагрузка *

import learngrails.*
class BootStrap {

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

Является ли преимущество, недостаток или стандарт для передачи идентификатора и выполнения получения или передачи объекта? Это изменение, учитывая мой случай не собирается сохранять что-либо в службе? Что-то я делаю явно неправильно? У вас есть лучшее предложение для названия?

1 Ответ

2 голосов
/ 15 июля 2011

Вы задали много вопросов и должны разбить их на несколько отдельных вопросов. Но я остановлюсь на общем вопросе - этот подход в целом хорош.

При запуске и совершении транзакции не требуется много времени, которая не обеспечивает постоянство базы данных, но это расточительно, поэтому вам следует добавить

static transactional = false

В этом случае вы используете класс как легко внедряемый одноэлементный вспомогательный класс. В сервисах удобно выполнять транзакционную работу, потому что они автоматически транзакционны, но это далеко не обязательно.

Но одно дело - не используйте замыкания в службах. Они требуются в контроллерах и taglibs (до 2.0 в любом случае), но их всегда следует избегать в сервисах и других классах. Если вы не используете тот факт, что это замыкание - то есть передаете его как объект методу в качестве параметра или устанавливаете его делегат и т. Д. - тогда вы просто слишком круты. Если вы вызываете его как метод, сделайте его методом. Реальный недостаток закрытия сервисов заключается в том, что когда вы хотите, чтобы они были транзакционными, они не могут быть такими. Это происходит потому, что перехватчики Spring перехватывают вызовы методов, а не вызовы замыкания, которые, как утверждает Groovy, являются вызовами методов. Таким образом, не будет никакого перехвата транзакций, безопасности и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...