当前位置: 首页 > 面试题库 >

模块取决于Dagger中的另一个模块

慕阳文
2023-03-14
问题内容

我试图使用Dagger在正在构建的应用程序上进行依赖注入,当我拥有一个程序包的模块(取决于注入器(可能是另一个模块)提供的值)时,在构造适当的DAG时遇到了麻烦。

如果我有一个用于配置变量的简单模块(例如,我可能想换成测试环境)

@Module(
    injects = DependentModule.class,
)
public class ConfigModule {

    @Provides @Named("ConfigOption") String provideConfigOption() {
        return "This Module's configurable option!";
    }
}

而另一个模块依赖于它,例如

@Module(
    injects = {
            TopLevelClass.class
    }
)
public class DependentModule {

    @Inject @Named("ConfigOption") String configOption;

    public DependentModule() {
        ObjectGraph.create(this).inject(this);
        doSomethingWithConfig(configOption);
    }

    @Provides @Singleton UsefulValue provideUsefulValue() {
        // Whatever this module needs to do...
    }
}

我尝试在构造函数中引导注入的行失败,并且它抱怨我没有injects在适当的模块中指定显式行。

通过反复试验,我发现如果@Module在行中添加include = ConfigModule.class,这种情况就消失了,但这在语义上给我留下了深刻的印象,因为a)我将创建的DAG现在将包括两个模块的值,而不仅仅是一个,
b)它首先破坏了DI链接特定模块的目的/灵活性,而不是简单地让Dagger注入适当的值。

我想我不应该this只为了注入对象图而创建对象图?但是后来我遇到了不链接特定模块的问题…

简洁地说:

  • 将值注入一个可能由其他模块提供的模块的“正确”方法是什么?在这里,我正在使用字段注入,但是我对构造函数注入的实验也导致了很多失败。
  • 相关地,什么时候使用addsTovs includes

谢谢 :)


问题答案:

您无需在一个模块中显式地进行任何注入(字段或构造函数)。只需使用addsTo和即可includes
includes允许将模块添加到另一个模块并使用它们提供的所有内容。例:

@Module()
public class ModuleA {
    @Provides @Named("ValueA") String provideValueA() {
        return "This is ValueA";
    }
}

@Module(
    includes = ModuleA.class
)
public class ModuleB {
    // ValueA comes from ModuleA
    @Provides @Named("ValueB") String provideValueB(@Named("ValueA") String valueA) {
        return valueA + " and ValueB";
    }
}

addsTo与一起使用ObjectGraph.plus(Object... modules)。当图形已经创建并包含一些模块时(例如在Application类中),您可以使用创建新图形(例如在Activity中)plus。例:

@Module()
public class ApplicationModule {
    @Provides @Named("ValueA") String provideValueA() {
        return "This is ValueA";
    }
}

@Module(
    addsTo = ApplicationModule.class
)
public class ActivityModule {
    // ValueA comes from ApplicationModule
    @Provides @Named("ValueB") String provideValueB(@Named("ValueA") String valueA) {
        return valueA + " and ValueB";
    }
}

public class DemoApplication extends Application {
  private ObjectGraph graph;

  @Override public void onCreate() {
     super.onCreate();
     graph = ObjectGraph.create(getModules().toArray());
  }

  protected List<Object> getModules() {
      return Arrays.asList(
          new ApplicationModule()
      );
  }

  public void inject(Object object) {
      graph.inject(object);
  }

  public ObjectGraph getObjectGraph() {
      return graph;
  }
}

public class DemoActivity extends Activity {
    private ObjectGraph activityGraph;

    @Override protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Create the activity graph by .plus-ing our modules onto the application graph.
        DemoApplication application = (DemoApplication) getApplication();
        activityGraph = application.getApplicationGraph().plus(new ActivityModule());

        // Inject ourselves so subclasses will have dependencies fulfilled when this method returns.
        activityGraph.inject(this);
    }

    @Override protected void onDestroy() {
        // Eagerly clear the reference to the activity graph to allow it to be garbage collected as
        // soon as possible.
        activityGraph = null;
        super.onDestroy();
    }
}

您也可以检查此示例以创建图形范围。



 类似资料:
  • 我正在尝试建立一个项目,其中我有两个模块和。 lib模块有自己的Dagger组件和模块,它应该是不知道味道的。

  • 问题内容: 我已使用以下命令“ go mod init database”在“数据库”文件夹中的“ GOPATH”之外创建了个人使用的模块库,但我不知道: 如何在其他模块中使用/ 导入 该模块? 操作系统: Windows 7 ,Go: v1.11 问题答案: 最简单,可行的现成解决方案是将您的包/模块放入VCS(例如github.com),因此其他包(在其他模块内部)可以通过导入来简单地引用它:

  • 我有一个Android Gradle 1.1项目,其中有几个模块对其他模块有一些依赖性。 我的模块本身编译得很好。 我的问题与测试模块有关。(仅供参考:我正在使用Robolectra) 我见过几个与Android构建相关的“类似”问题 Android Gradle 1.1-添加对另一个项目测试的测试依赖性 如何运行依赖于Android库模块的单元测试 Gradle Android单元测试依赖于“a

  • 问题内容: 假设我有一个名为的软件包,其中包含: 和: 然后我执行以下脚本: 这是我的期望: 这是我得到的: 谁能解释我的误解? 问题答案: 您正在使用。在导入模块的全局范围(或​​发生import语句的任何范围)中成为符号。 当您为指定新值时,您也只是在更改哪些值点,而不是实际值。尝试直接使用in导入,并通过设置在那里进行实验。这样,您实际上将在此上下文中修改哪个是“实际”值。 它有点令人费解,

  • 问题内容: (来自/ r / androiddev的x- post ) 我想以说这不是“更好”的帖子作为开头。严格来说,这是一个关于如何使用Dagger构建东西(以及如何在Kodein中构建它以帮助说明问题)的问题。 我已经在多个工作项目中使用Kodein几年了,但是我发现它使用起来非常容易,以至于我再也不会看过Dagger了。我开始了一个新的个人项目,我想再给Dagger做个尝试。 为简单起见,