我试图使用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
只为了注入对象图而创建对象图?但是后来我遇到了不链接特定模块的问题…
简洁地说:
addsTo
vs 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做个尝试。 为简单起见,