2011-07-14 7 views
0

何も保存する必要のないサービスを作成しています。それはいくつかの値を取得します。データベースでいくつかのことを調べてから、応答を咳打つ。サービスをより高速にする/オーバーヘッドを減らすために何かすべきことはありますか?また、何かを渡すための最良の方法は何ですか?私は通常、IDを渡してもう一度それを取得します。それは良い/悪い/愚かなのですか?Grails - ドメインオブジェクトを渡してサービスを利用する方法

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を渡してオブジェクトを取得したり取得したりする利点、不利または標準ですか?サービスに何も保存しないというケースを考えれば、これは変わるのでしょうか?私は間違ったことをしていますか?あなたはそのタイトルのより良い提案をしていますか?

答えて

2

あなたは多くの質問をしており、これをいくつかの個別の質問に分割する必要があります。しかし、私は全体的な問題に対処します - このアプローチは一般的には問題ありません。

ありオーバーヘッドの多くは、任意のデータベースの永続性を行いませんトランザクションを開始し、コミットしていないのですが、それは無駄である、あなたはこの場合

static transactional = false 

を追加する必要がありますので、あなたがクラスを使用しています簡単に注入されたシングルトンヘルパークラスとして。トランザクション処理は自動的にトランザクショナルなのでサービスで行うのが便利ですが、それは要件からは程遠いものです。

ただし、1つのこと - ではなく、サービスでの閉鎖を使用します。それらはコントローラとタグライブラリで必要とされています(2.0まで)。しかし、サービスや他のクラスでは避けてください。クロージャであるという事実を使用していない場合、つまり、パラメータとしてメソッドにオブジェクトとして渡したり、デリゲートを設定したりするなど、あまりに面倒です。メソッドのように呼び出す場合は、それをメソッドにします。サービスの閉鎖に対する真の欠点は、トランザクションにすることを望むときは不可能だということです。これは、Springインターセプタがメソッド呼び出しをインターセプトするためであり、Groovyがメソッド呼び出しであると思われるクロージャ呼び出しではないからです。だからトランザクション、セキュリティなどのための傍受はありません

+1

私は@ burt-beckwithに同意し、ドメインIDをサービスに渡す理由はない、ということを追加したいだけですあなたがそうしないと本当に良い理由がない限り、私はオブジェクト自体を渡すでしょう。 – sbglasius

+0

スレッドが死んでいるように見えるので、この回答は役に立ちました。 – Mikey

+0

ありがとうございました!私は、サービスにおけるクロージャの非トランザクション動作を再現しようとしました。しかし、できませんでした。私がテストしたサンプルコードはhttp://pastebin.com/9L4jzMp3にあります。どんな助けもありがとう。 –

関連する問題