2016-12-01 6 views
6

私はDagger 2の新機能です。私はAndroidプロジェクトでそれを実装しようとしています。 にはGoogleApiClientが必要です。私はこのサービスでそれを注入するためにダガーを使用しています。ダガー2:コンポーネントは複数のスコープ付きコンポーネントに依存します

@FragmentScoped 
@Component(dependencies = {NetComponent.class, RepositoryComponent.class}) 
public interface CustomServiceComponent { 
    void inject(CustomService customService); 
} 

@Singleton 
@Component(modules = {AppModule.class, NetModule.class}) 
public interface NetComponent { 
    GoogleApiClient getGoogleApiClient(); 
} 

@Singleton 
@Component(modules = {AppModule.class, RepositoryModule.class}) 
public interface RepositoryComponent { 
    DatabaseService getDatabaseService(); 
} 

AppModuleNetModule、およびRepositoryModuleは方法が@Singleton @Provides 私は私のプロジェクトをビルドするとき、私はこのエラーを取得するマークがあります。

The locationServiceComponent depends on more than one scoped component: @Singleton NetComponent @Singleton RepositoryComponent

私はLocationComponentが2つの@Singletonスコープのコンポーネントに依存することはできませんが、私は両方必要な理解を私のサービスでそれらの両方が@Singletonである必要があります。

同じことを行うには、より良い選択肢はありますか?

+0

"私のLocationComponentは2つの@Singletonスコープコンポーネントに依存できないことを理解しています" - >これがなぜ不可能であるか説明できますか? –

答えて

6

@Singletonと記されている複数のコンポーネントがありますが、ライフサイクルはコンポーネントの参照を保持するクラスのライフサイクルに従います。

これは、アクティビティにとRepositoryComponentを初期化して保持していれば、そのアクティビティのライフサイクルに従い、本当にアプリシングルトンではないことを意味します。

したがって、おそらくAndroidアプリには@Singleton個のコンポーネントが必要になることはありません。このように一つの成分にあなたの2つのシングルトンコンポーネントを組み合わせる考えてみましょう:

@Component(modules = {AppModule.class, NetModule.class, RepositoryModule.class}) 
@Singleton 
public interface AppComponent { 
    GoogleApiClient getGoogleApiClient(); 

    DatabaseService getDatabaseService(); 
} 

その後、あなたは、アプリケーションレベルでこの@Singletonコンポーネントを保持し、断片またはアクティビティのレベルで初期化され、依存コンポーネントでの使用に利用可能にすることを確認してください。

public class MyApp extends Application { 

    private final AppComponent appComponent; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     appComponent = DaggerAppComponent.builder() 
          //modules if necessary 
          .build(); 
    } 

    public AppComponent getAppComponent() { 
     return appComponent; 
    }     
} 

なお、限り、あなたのすべての依存コンポーネント自体を持っていない、あなたはまだあなたが好きなようにこれらの多くを作成することができます@FragmentScoped

1つのコンポーネントにGoogleApiClientDatabaseServiceが注入されても、別のDagger 2モジュールで提供されるため、懸念の分離が達成されます。

+0

この解決策は汚いです。 AppComponentはすべてのモジュールを共有しています。代わりに、必要な構成と提供されるコンポーネントの必要性に応じて、他の多くのコンポーネントからコンポーネントを作成できるようにします。どうやってするか?クライシス導入ウェル構造 – murt

+0

彼は非シングルトンスコープでシングルトン依存性を提供しようとしています。それは動作しません。あなたは再構成が必要ですが、スコープでコンポーネントをグループ化する必要があります。つまり、アプリケーションスコープの単一のコンポーネント、次にサブコンポーネントまたは依存コンポーネントをアクティビティまたはフラグメントのレベルでグループ化する必要があります。 –

+0

@murtあなたは、従属コンポーネントを使っていくつかの他の回答を見ることができます。https://stackoverflow.com/a/40751767/5241933 –

関連する問題