2011-10-29 7 views
2

私は10のgrailsサービスを持っているとしましょう。これらのサービスのそれぞれは、RESTサービスを呼び出す予定です。そこで、RESTコードをカプセル化して、10のサービスで簡単に再利用できるようにしたいと考えています。オプションを検討してgrailsサービス階層

、私は可能性:

1)REST関連のコードを持つ別のサービスまたはBeanを作成し、それを10個のサービスの一つ一つを注入。
2)RESTコードを含むスーパークラスサービスを作成し、すべての10のgrailsサービスがこのクラスを拡張するようにします。

私はオプション2を使用しようとしていますが、スーパークラスへの依存性注入に関する問題に取り組んでいます。

例:

class SuperService { 
    def aString 
} 

class ExampleService extends SuperService { 
} 

resources.groovy:

beans = { 
    superService(SuperService) { 
     aString = "something" 
    } 
    exampleService(ExampleService) { 
    } 
} 

統合テストを実行している間、私は、デバッガでこれを実行すると、私はaStringの値がnull参照してください。明らかに、それは私のために問題になるだろう。

次resources.groovyと同じコードを実行し、予想されるように

:= "何か"

beans = { 
    superService(SuperService) { 
    } 
    exampleService(ExampleService) { 
     aString = "something" 
    } 
} 

とaStringの。

したがって、私は設定配線が少なくて済むため、オプション2を優先しますが、実現可能なアプローチではないと思います。言い換えれば、サブクラスのそれぞれにaStringを設定する必要がある場合、値はありません。

思考?

何か不足していますか?

他のオプションもあります。事前に

おかげで、 トッド

+0

なぜオプション2の構成配線が少なくなると思いますか? –

答えて

0

あなたはDRYであるという点で、オプション#2との正しい考えを持っている - しかし、それは本当にただ1行です。 superServiceオブジェクトと共通の唯一のものがサービスであり、他のメソッドがない場合、あなたは本当に自分自身を保存していません。何かがあれば、依存関係注入のためにスーパークラスを宣言するだけで、隠され、維持するのが難しくなる可能性があります。

superServiceにRESTメソッドを配置するように思えたので、なぜsuperServiceへの依存性注入が心配されているのか分かりません。あなたのメソッドがそこにあるRESTインタラクションを実行して、呼び出すことができます。または、オプション1と2の組み合わせを試していますか?

+0

スーパーサービスでは、springSecurityService、またはSpring Securityプラグインが提供するutilオブジェクトまたはholderオブジェクトのいずれかにアクセスする必要があります。このスーパーサービスは、残りのコールを行う前に誰がログインしているかを知る必要があります。金曜日に、このsuperServiceで何かを取得することができませんでした...常にセキュリティを使用するとNPE。私は自分の問題が依存性注入であると思う。 –

+0

さて、今朝、次のコードがsuperClassで動作しています:def ctx = AH.application.mainContext SpringSecurityService springSecurityService = ctx.springSecurityService def loggedInUser = springSecurityService。getPrincipal() –

+0

面白いです。私はまだ注射がスーパーサービスにうまくいかなかったことに驚いています。 Grails 2.0.RC1を使用していますか?または1.3.7? – Todd