2016-03-31 5 views
1

私がやりたいことの文脈を説明すれば、私の質問が意味するところがわかるはずです。 私はJavaFXプロジェクトのGluon IgniteライブラリでDaggerを使用しようとしています。Daggerで管理されているインスタンスをすべてのクラスの@Injectアノテーションのみを使用してリクエストする方法はありますか?

私の設定はちょっと変わっています:
私はクライアント間で共有されるべきいくつかのクラスを含むEJBプロジェクトを持っています。 @Statelessと@Singletonでアノテーションされた2つのクラスが含まれているので、それらはEJBとしてアプリケーションサーバーにデプロイできます。 スタンドアロンのJavaFXアプリケーションからEJBモジュールのクラスを使いたいです。したがって、JavaFXクライアントは、EJBをアプリケーションサーバーにデプロイしなくても動作するはずです。

私は、JavaFXアプリケーションでEJBクラスをパッケージ化するようにgradleに指示しました。 EJBモジュールは、展開可能にするためにgradle multi-projectビルドによって作成されるEARプロジェクトの一部です。 JavaFXのビルドは、EARモジュールおよびマルチプロジェクトの設定とは無関係です。 Dagger(Gluon Ignite)を使用して、EJBモジュールからサービスを注入したいと考えています。可能であれば、標準的なEJBモジュールとして展開できるように、ダガー固有のコードでEJBクラスを「ポーリング」する必要はありません。また、EJBは互いのインスタンスを要求できる必要があります。 DaggerはJSR-330標準アノテーションに基づいているため、動作しないとは思えません。

私は私が唯一のインターフェイスを介して注入されなければならないクラスのプロバイダが含まれている1つの短剣モジュールを書いた

private final DIContext context = new DaggerContext(this,() -> Arrays.asList(new DaggerApplicationModule())); 
@Inject 
GlobalService globalService; 

を追加することによって、私のApplicationクラスのうち、唯一の作業の注射を持っています。他のクラスでは、引数のないコンストラクタに@Injectを追加しました。私が理解している限り、アプリケーションクラスのstartメソッドのメソッドcontext.init();(Gluon Igniteに属しています)を呼び出すと、フィールドインジェクションが発生します。それとは対照的に 私はApplicationクラス以外のクラスでの依存関係を解決する一つの方法は、手動でこのような何か書き込むことであることを考え出し:それ以外の場合は、@Injectでフィールドに注釈を付けることで、彼らはヌルまま

ObjectGraph og = ObjectGraph.create(new DaggerApplicationModule()); 
globalService = og.get(GlobalService.class); 

を。私の場合は、これは私のEJBクラスで嫌な定型的なコードのように見えます。私は実際に手動で同様のものを書く必要がありますか?たぶん私は全体のコンセプトを間違っているでしょう。

答えて

0

ダガーではまだ、Moduleアノテーションのクラスをリストする必要があります。 Ignite Daggerの例のモジュール定義を次に示します。 "injects"属性に注意してください。

@Module(library = true, injects = {DaggerApp.class,ViewController.class}, complete = false) 
class DaggerModule { 

    @Provides 
    public Service provideService() { 
     return new Service(); 
    } 

} 
+0

確かに、injects属性で試行錯誤しました。私の設定では、コンパイラが必要とする唯一のクラスはアプリケーションクラスです。私の理解のため、ObjectGraphのエントリーポイントであり、Dagger自体で作成されていないので、ViewControllerクラスについてDaggerに伝えることは理にかなっていますが、残念ながらそれは何の違いもありません。 – MannikJ

関連する問題