2011-02-02 11 views
14

Grailsでサービスインタフェースを作成することが可能かどうか、私はそれを行う正しい方法を見つけることができません。 JavaとGroovyを混ぜているようですので、この説明は、満足のいくものではない。Grailsサービスの実装からインタフェースを分離するには?

http://www.grails.org/doc/latest/guide/8.%20The%20Service%20Layer.html

それはインターフェースのメカニズムは、最高の機能の一つであることを考えると、フレームワークの悪い設計上の欠陥のように私には思えますJava(および大部分のOO言語)

この問題を明確にするための考え方はありますか?

ありがとうございます! Mulone

+3

'src'でインタフェースを作成し、それを実装する際に、何が問題になりますか?あるいは、その場でサービスの実装を置き換えることができるようにしたいですか?デリゲート(http://groovy.codehaus.org/Replace+Inheritance+with+Delegation)が役に立ちます。 –

答えて

5
  • under src/groovy
  • 保存されたクラスcom.mycompany.mypackage.MyInterface.groovygrails-app/services

    class MyService implements MyInterface { 
        // service implementation goes here 
    } 
    
+0

しかし、この場合コントローラ「def myInterface」で指定することはできますか?注射はどうしたらうまくいくの? – Mulone

+0

いいえ、あなたは 'def myService'を宣言します –

+0

どのインプリメンテーションをコントローラに注入したいのかを依存性インジェクションがどのように知るのですか? tim_yatesが言うように、名前を付けることによってそれを伝える必要があります。実行時に、インタフェースを実装する別のBeanリファレンスを取得してmyServiceに割り当てることで、同じメソッドを使用できます。 – sbglasius

1

そのない設計上の欠陥の下に格納されたサービスの実装をサービス・インターフェースを定義して定義します。 Groovyは「ダックタイピング」を使用する動的言語である点でJavaとは異なります。 Groovyの興味深い点は、インターフェースもあるということです。したがって、@ donの提案に従うならば、サービスがインターフェイスに準拠していることを確認できますが、grailsでDIを行う方法はサービスの実装を指定するだけです。つまり、コンパイル時にのチェックを取得しないと、javaの場合と同様にサービス実装が使用されます。

ここでは密結合はないことに注意してください。カップリングは、何かが型に束縛されていることを意味します。しかしグルーヴィーのタイピングシステムがゆるいと、タイプは本質的にダイナミックなものです。したがって、Javaでは、型を特定の実装に宣言すると、後で型を変更するとコードがコンパイルされないことがあります。 Groovyでは、 'def'を使うとコードは常にコンパイルされます(これは正しいと思います)

17

あなたはインターフェースを持つことができますが、実際には必要ありません。私があなたを正しく理解していれば、あなたはサービスの2つの実装を持ち、どのサービスを使うかを選択できるようにしたいと考えています。

単にあなたが指定することができgrails-app/conf/spring/resource.groovyで、その後、例MyService1MyService2の名前が付いた2つのサービスを実装します。でも

beans = { 
    ... 
    // syntax is beanId(implementingClassName) { properties } 
    myService(MyService1) 
    ... 
} 

か:

beans = { 
    ... 
    if (someConfigurationOption) { 
     myService(MyService1) 
    } else { 
     myService(MyService2) 
    } 
} 

をこれは、あなたが実際に注入するためにどのサービス春を伝える方法ですmyService適切な実装になる自動ワイヤー

public MyController { 
    def myService 
    ... 
} 

と春:今、あなたは次のようにmyServiceを使用することができます。これにより、たとえば、一部の構成に基づいて、使用するサービス実装を構成することができます。

0

私が見つけた最良の解決策は、春の別名を使用しています。基本的には以下を行う必要があります。

1)

2)MyService.groovy(SRC /グルーヴィーでインターフェイスを作成します)あなたがそれを必要な場所あなたのサービスを注入:

class MyController { 
    MyService myService 
} 

3)ことを実行する定期的なサービスを作成します。インタフェース(ImplOneService.groovy

4)resources.groovyにエントリを追加して、使用する実装を定義します(最終的には環境や必要なものをテストします):

beans = { 
    if (...development, useFTP, etc...) { 
     springConfig.addAlias 'myService', 'ImplOneService' 
    } else { 
     springConfig.addAlias 'myService', 'ImplTwoService' 
    } 
} 

Complete sources here

私のコメント:Groovyでのインターフェイスを使用して、本当に「私はとのより快適だいくつかのJavaのものに固執したい」のいくつかの種類のように思えます。この場合、強タイピング。しかし、それはまさにGroovyの素晴らしい部分です。「心配する必要はなく、あなたはJavaの方法を保つことができます。

関連する問題