如何清理/拆卸模块内提供的对象

tir*_*r38 5 java dagger-2

我有一个定制的匕首瞄准镜。

@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface FeatureScope {
}
Run Code Online (Sandbox Code Playgroud)

我有一个组件/模块,它提供与此范围相关的演示器(任何 UI 元素都可以在这里真正工作)。

@FeatureScope
@Component(modules = {
        CustomScopedModule.class
})
public interface CustomScopedComponent {

}
Run Code Online (Sandbox Code Playgroud)
@Module
public class CustomScopedModule {

    @FeatureScope
    @Provides
    Presenter providePresenter() {
        return new Presenter();
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道当不再需要这个自定义范围时,由我来创建/销毁它。所以在我的应用程序中我有:

public class MyApplication extends Application {

    private CustomScopedComponent customScopedComponent;

    public CustomScopedComponent getCustomScopedComponent() {
        if (customScopedComponent == null) {

            customScopedComponent = DaggerCustomScopedComponent.builder()
                    .contactsModule(new CustomScopedModule())
                    .build();
        }
        return customScopedComponent;
    }

    public void finishedWithCustomScopedComponent() {
        customScopedComponent = null;
    }
Run Code Online (Sandbox Code Playgroud)

但是,我现在需要在将组件(和演示者)超出范围后进行“清理”。我不能只将 customScopedComponent 设置为 null。我还需要在我的上调用 cleanup() Presenter

class Presenter {

    public void cleanup() {
        // Dispose of all the things
        // Release any DB connections
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

处理/创建调用路径来处理此问题的最佳方法是什么?我发现 Dagger 确实没有任何工具可以实现此目的,我需要推出自己的解决方案

所以我想至少我可以向模块添加一个方法:

@Module
public class CustomScopedModule {

    @FeatureScope
    @Provides
    Presenter providePresenter() {
        return new Presenter();
    }

    public void cleanup() {
        // call Presenter.cleanup();
    }
}
Run Code Online (Sandbox Code Playgroud)

并在销毁组件时调用它:

public class MyApplication extends Application {

    private CustomScopedComponent customScopedComponent;
    private CustomScopedModule customScopedModule;

   ...

    public void finishedWithCustomScopedComponent() {
        customScopedModule.cleanup();
        customScopedComponent = null;
    }
}
Run Code Online (Sandbox Code Playgroud)

但我的问题是,模块的方法如何cleanup()访问演示者?我唯一能想到的就是将演示者保存为模块内的一个字段:

@Module
public class CustomScopedModule {

    private Presenter presenter;

    @FeatureScope
    @Provides
    Presenter providePresenter() {
        presenter = new Presenter(); // save instance to cleanup later
        return presenter;
    }

    public void cleanup() {
        if (presenter != null) {
            presenter.cleanup();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对我来说,这看起来很丑陋,而且非常不符合 Dagger 风格。