2017-10-22 11 views
0

ダガー2の意味を理解しようとしていて、悲惨に失敗しています。ここでダガー2の最も基本的なサブコンポーネントのサンプルが動作しない

は、私が仕事に取得しようとしているコードです:

TranslationServiceは、DataServiceに依存している:2つのサービスを提供するために、

// Relies on injected DataService 
public class TranslatorService implements ServiceContracts.TranslatorService 
{ 
    ServiceContracts.DataService mDataService; 

    public TranslatorService(ServiceContracts.DataService dataService) { 
     this.mDataService = dataService; 
    } 

    public String translate(String key) { 
     if (mDataService == null) 
      return "Default"; 

     return mDataService.getData(key); 
    } 
} 

// implements DataService 
public class LocalDataService implements ServiceContracts.DataService { 
    @Override 
    public String getData(String key) { 
     return key + " (local)"; 
    } 
} 

二つのモジュール:

@Module 
public class DataServiceModule { 
    @Provides 
    public ServiceContracts.DataService dataService() { 
     return new LocalDataService(); 
    } 
} 

@Module 
public class TranslatorModule { 
    @Provides 
    TranslatorService translatorService(ServiceContracts.DataService dataService) { 
     return new TranslatorService(dataService); 
    } 
} 

一つを@コンポーネントと1つの@Subcomponent(TranslationServiceはDataServiceに依存するため、

@Component(modules = {DataServiceModule.class}) 
public interface DataServiceComponent { 
    TranslatorComponent translatorComponent(TranslatorModule translatorModule); 
} 

@Subcomponent(modules = {TranslatorModule.class}) 
public interface TranslatorComponent { 
    TranslatorService translatorService(); 
} 

コードはうまくいきます。私は今、サブコンポーネントの生成されたダガーの実装を見たとき、私はこれを取得:それはプライベートであるため、

private final class TranslatorComponentImpl implements TranslatorComponent { 
    private final TranslatorModule translatorModule; 

    private Provider<TranslatorService> translatorServiceProvider; 

    private TranslatorComponentImpl(TranslatorModule translatorModule) { 
     this.translatorModule = Preconditions.checkNotNull(translatorModule); 
     initialize(); 
    } 

    @SuppressWarnings("unchecked") 
    private void initialize() { 

     this.translatorServiceProvider = 
      TranslatorModule_TranslatorServiceFactory.create(
       translatorModule, DaggerDataServiceComponent.this.dataServiceProvider); 
    } 

    @Override 
    public TranslatorService translatorService() { 
     return translatorServiceProvider.get(); 
    } 
    } 

だから、基本的に私は、サブコンポーネントを使用することはできません。 TranslatorServiceの実際のインスタンスをどのように取得するのですか?

私は心から誰かが私を助けることを願って - 私は今、数時間のためにこれを把握して、エラーまたはプライベートコンポーネントクラスの実装を構築取得しようとしています...

+0

ここでは何をしようとしているのかよくわからないので、これらの依存関係を注入する場所にコードを投稿できますか? – Ankit

+0

私は本当に「何かを生む」ことを試みているわけではありません...それは、ダガーを本当に理解するために、基本サンプルで遊んでいるようなものです。私はC#の背景から来ているし、C#のDIコンテナで少し異なって動作します。 サブコンポーネントの全体のコンセプトは私を少し逃す。 私は通常、(Daggerから)DaggerTranslatorComponent.build()。xxxxxのようなものを入手して、インジェクタを作成できるようにします。しかし、DaggerTranslatorComponentは存在しないので、私は立ち往生しています。 – Wolfgang

答えて

1

手動短剣に手を触れてはなりませんモジュール実装。 というクラスに注入したいとします。void inject(A a);というメソッドをサブコンポーネントに追加します。

そして、そのクラスの内部で、そのフィールドのタイプがあなたのダガーモジュールによって提供されている場合、それは@Injectで注釈さフィールドに注入します

DaggerDataServiceComponent.builder() .build() .translatorComponent(new TranslatorModule()) .inject(this);

を呼び出します。

これはあなたにダガーのアイデアを得るでしょう。これを理解したら、コンポーネントにロジックを実装します。私の例では、両方のコンポーネントが毎回作成されるため、サブコンポーネントは無意味です。

+0

私は参照してください...ちょうど確認する:私は(広い範囲)親インスタンスのインジェクタを取得するために "DaggerParentComponent.builder()。build()"を使用し、次に同じインジェクタを使用して1つまたは多くの "ChildComponent(new ChildModule())"インジェクタが1つまたは複数の子インスタンス(狭いスコープ)に対応していますか? または、私はいつも同じChildInjectorをすべての異なる子インスタンスに使用しますか? – Wolfgang

+0

それは異なります。サブコンポーネントは、親コンポーネントと同等またはそれ以上のライフサイクルを持つように設計されています。スコープを使用してオブジェクトライフサイクルを管理しているわけではないので、新しいサブコンポーネントを作成することは意味がありません。ただし、サブコンポーネントの依存関係にスコープを追加すると、コンポーネントごとにオブジェクト作成を管理できます。たとえば、TranslatorModule()とTranslatorComponentクラスの依存関係に@SomeScopeを追加すると、TranslatorServiceのライフサイクルをサブコンポーネントのライフサイクルにバインドします。 Subcomponentの新しいインスタンスを作成すると、TranslatorServiceの新しいインスタンスが作成されます。 – Tuby

+0

ありがとうございました!今では(スコープでも)機能し、最終的に私には合っています。 – Wolfgang

関連する問題