我正在尝试使用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
and 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)
。当图形已经创建并包含一些模块(例如在应用程序类中)时,您可以使用以下命令创建新图形(例如在 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();
}
}
您还可以检查this创建图表范围的示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)