2017-11-20 6 views
1

異なるサービスクラスの依存関係としてカスタムクラスを挿入したいのですが、動作しません。常にNPEで終わります。ここに私の例(単純なJava SE)...すべてが実行されている取得するDagger 2を使用した複数のサービスクラスの1つの依存関係

私の主なクラスがある

public class Main { 
     public static void main(String[] args) throws IOException, TimeoutException { 
      MyApplication MyApp = new MyApplication(); 
      MyApp.execute(); 
     } 
    } 

MyApplicationをクラス

public class MyApplication { 

    private MyApplicationComponent appComponent; 

    @Inject FooService fooService; 
    @Inject BarService barService; 
    @Inject BazService bazService; 

    public MyApplication() { 
     component = DaggerMyApplicationComponent.builder().build(); 
     component.inject(this); 
    } 

    public void execute() { 
     fooService.doStuff(); 
     barService.doStuff(); 

     // this will happen in the FooService construct, see below   
     // bazService.doStuff(); 
    } 
} 
使用せずに、ダガーで定義されたコンポーネントおよびモジュールのクラス

@Injectコンストラクタウェイ

@Singleton 
@Component(modules = {MyApplicationModule.class}) 
public interface MyApplicationComponent { 
    void inject(MyApplication application); 
} 

@Module 
public class MyApplicationModule { 
    @Singleton 
    @Provides 
    FooService provideFooService() { 
     return new FooService(); 
    } 

    @Singleton 
    @Provides 
    BarService provideBarService() { 
     return new BarService(); 
    } 

    @Provides 
    BazService provideBazService() { 
     return new BarService(); 
    } 
} 

MyApplicationModuleとMyApp必要な依存関係を提供するlicationComponentは、Main.class内で動作します。また、FooServiceクラス内でBazServiceを使用したいと考えています。したがって、私は@Injectの方法を使ってFooService.classとの依存関係として定義します。常にMain.classを実行FooService.class

public class FooService { 
    @Inject BazService bazService; 

    public FooService(){} 

    public doStuff(){ 
     bazService.doStuff(); 
    } 
} 

内BazServiceの@Injectを使って

が原因FooSerivceクラスで未定義bazServiceに、NPE以内に終了します。私はどこにでも注釈を追加することができなかったとは思わない。私はダガーがこのように動作しないと思います...どんなアイデアですか?

答えて

0

FooServiceは、フィールド注入を使用してbazServiceを注入する予定ですが、この前にbazServiceを呼び出しています。 FooServiceのコンストラクタでbazService.doStuff()を呼び出す場合は、コンストラクタインジェクションを使用する必要があります。

+0

ありがとうございました。あなたが正しい!私は悪い例を選びます。私は最後のコードブロックを変更しました。 FooService内のdoStuff()は、BazService内で同じメソッドを呼び出すようになりました。それは動作しません.../ – l00kus

+0

それはまだNPEを投げていますか?注射はすぐにうまくいくはずです。 – Dondump

関連する問題