具有不同范围的模块

Modules with different Scopes

如何创建一个带有注解(如@UserScope)的模块依赖于另一个 @Singleton 模块?

@Module(includes = {ApplicationModule.class})
public class JobManagerModule
{
    private static final String TAG = JobManagerModule.class.getSimpleName();

    @UserScope
    @Provides
    public JobManager providesJobManager(final Context context)
    {
        Log.d(TAG, "Providing JobManager");
        final Configuration configuration = new Configuration.Builder(context).build();
        return new JobManager(configuration);
    }
}

在这里,JobManagerModule 提供使用@UserScope,但ApplicationModule 提供上下文对象(JobManagerModule 需要)作为@Singleton。

这显示错误。

如果要创建不同的 Scope,则此作用域必须是 @Singleton 的子组件。

假设你有 ApplicationComponent 注释 @Singleton:

@Singleton
@Component(
        modules = ApplicationModule.class
)
public interface ApplicationComponent {

    JobManagerComponent provide(JobManagerModule jobManagerModule);
}

ApplicationModule 提供 Context:

@Module
public class ApplicationModule {
    protected final Application mApplication;

    public ApplicationModule(Application application) {
        mApplication = application;
    }

    @Provides
    @ApplicationContext
    public Context provideApplicationContext() {
        return mApplication;
    }
}

注意,ApplicationComponent 必须提供 JobManagerComponent Context 提供了 @ApplicationContext 注释。

现在您创建 JobManagerComponent 作为 ApplicationComponent@Subcomponent:

@UserScope
@Subcomponent(
        modules = JobManagerModule.class
)
public interface JobManagerComponent{
}

JobManagerModule:

@Module
public class JobManagerModule
{
    private static final String TAG = JobManagerModule.class.getSimpleName();

    @UserScope
    @Provides
    public JobManager providesJobManager(@ApplicationContext Context context)
    {
        Log.d(TAG, "Providing JobManager");
        final Configuration configuration = new Configuration.Builder(context).build();
        return new JobManager(configuration);
    }
}

注意从 @Module 注释中删除了 include 并且 Context@ApplicationContext

注释

创建JobManagerComponent

JobManagerComponent jobComponent = DaggerApplicationComponent.builder()
    .applicationModule(applicationModule)
    .build()
    .provide(new JobManagerModule());