java - 是否可以在 Dagger 2 中有选择地为组件设置模块?

标签 java android dependency-injection dagger-2

引起:java.lang.IllegalStateException:必须设置analyticsModule

我正在构建一个使用模板式初始化的库。用户可以使用该库有选择地为项目设置模块。它使用 Dagger 2 进行 DI。

但是 Dagger 2 似乎不允许可选模块。不能简单地忽略未设置的模块吗?

最佳答案

您可能需要考虑使用多重绑定(bind),它允许用户有选择地将依赖项添加到 Set<T> 中或 Map<K,V> .这是一个例子:

interface Plugin {
    void install(Application application);
}

@Component({ModuleA.class, ModuleB.class})
interface PluginComponent {
    Set<Plugin> plugins();
}

@Module
class ModuleA {
    @Provides(type = SET) Plugin providFooPlugin() {
        return new FooPlugin();
    }
}

@Module
class ModuleB {
    @Provides(type = SET) Plugin providBarPlugin() {
        return new BarPlugin();
    }
}

在这种情况下,您仍然需要每个模块的实例,即使它没有被使用。解决这个问题的一种选择是使用 @Provides(type = SET_VALUES) ,并拥有您不想关闭以返回的模块 Collections.emptySet() .这是一个修改后的例子:

interface Plugin {
    void install(Application application);
}

@Component({ModuleA.class, ModuleB.class})
interface PluginComponent {
    Set<Plugin> plugins();
}

@Module
class ModuleA {
    private final Set<Plugin> plugins;

    ModuleA(Set<Plugin> plugins) {
        this.plugins = plugins;
    }

    @Provides(type = SET_VALUES) Plugin providFooPlugins() {
        return plugins;
    }
}

@Module
class ModuleB {
    @Provides(type = SET) Plugin providBarPlugin() {
        return new BarPlugin();
    }
}

现在,您可以调用:

DaggerPluginComponent.builder()
    .moduleA(new ModuleA(Collections.emptySet())
    .build();

或者:

Set<Plugin> plugins = new HashSet<>();
plugins.add(new AwesomePlugin());
plugins.add(new BoringPlugin());
DaggerPluginComponent.builder()
    .moduleA(new ModuleA(plugins)
    .build();

关于java - 是否可以在 Dagger 2 中有选择地为组件设置模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34085765/

相关文章:

java - MediaPlayer 暂停和播放错误

Android ffmpeg 在第二次运行时失败

c# - 策略模式的实现如何在运行时选择正确的策略?

c# - 你如何制作一个通用的通用工厂?

java - 在 Jlist 项中添加 ToolTipText

java - 循环遍历数组

java - Gson 崩溃并出现 Failed to invoke protected java.text.NumberFormat() with no args 错误

android - 将 C 库连接到 iOS 应用程序

将 Mat 转换为 Android 位图时出现 Android OpenCV 错误

java - 如何在 Dagger 图中生命周期管理对象