私はGitHub でDagger2 Component Scopes Testのソース コードを読んでおり、アクティビティ用に定義された「カスタム スコープ」を見てきましたが、そのスコープを持つ@ActivityScope
4 モジュールのCleanArchitecture@PerActivity
を含む他のプロジェクトでそれを見てきました。
しかし文字通り、@ActivityScope
注釈のコードは次のとおりです。
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.inject.Scope;
/**
* Created by joesteele on 2/15/15.
*/
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}
モジュールで「魔法のように」使用できます。
@Module
public class ActivityModule {
@Provides @ActivityScope Picasso providePicasso(ComponentTest app, OkHttpClient client) {
return new Picasso.Builder(app)
.downloader(new OkHttpDownloader(client))
.listener(new Picasso.Listener() {
@Override public void onImageLoadFailed(Picasso picasso, Uri uri, Exception e) {
Log.e("Picasso", "Failed to load image: " + uri.toString(), e);
}
})
.build();
}
}
またはCleanArchitectureの例:
@Scope
@Retention(RUNTIME)
public @interface PerActivity {}
@PerActivity
@Component(dependencies = ApplicationComponent.class, modules = ActivityModule.class)
public interface ActivityComponent {
//Exposed to sub-graphs.
Activity activity();
}
@Module
public class ActivityModule {
private final Activity activity;
public ActivityModule(Activity activity) {
this.activity = activity;
}
/**
* Expose the activity to dependents in the graph.
*/
@Provides @PerActivity Activity activity() {
return this.activity;
}
}
これがJSR-330カスタムスコープに関係していることははっきりとわかりますが、このコードが特定のモジュールおよび/または特定のモジュールによって提供されるものを有効にするために、ここで何が起こっているのか正確にはわかりません実際のライフサイクルに依存しActivity
、単一のインスタンスのみが存在しますが、その特定のアクティビティがアクティブな場合のみです。
ドキュメントには次のように書かれています。
Scope
Dagger 1 only supported a single scope: @Singleton.
Dagger 2 allows users to any well-formed scope annotation.
The Component docs describe the details of
how to properly apply scope to a component.
Component docs pageを見るように言われていますが、404が表示されます。これも見ましたが...
このカスタムスコープを指定すると魔法のように問題なく動作する理由を明確にするために、助けを求めてもActivity-level scopes
よろしいですか?
(答えは、サブスコープはそのスーパースコープから依存関係を受け取ることができ、サブスコープはコンポーネントが存在する限り存在するということです。また、モジュールでスコープを指定する必要があり、1 つのスーパースコープをサブスコープするためにコンポーネントの依存関係を指定する必要があります。 )