Java 模块依赖于Dagger中的另一个模块
我试图用它在我正在构建的一个应用程序上进行依赖注入,当我根据注入器提供的值(可能由另一个模块提供)拥有一个包的模块时,构建正确的DAG会遇到麻烦 如果我有一个用于一些可配置变量的简单模块(例如,我可能希望将其替换为测试环境) 另一个模块依赖于它,例如Java 模块依赖于Dagger中的另一个模块,java,android,dependency-injection,dagger,Java,Android,Dependency Injection,Dagger,我试图用它在我正在构建的一个应用程序上进行依赖注入,当我根据注入器提供的值(可能由另一个模块提供)拥有一个包的模块时,构建正确的DAG会遇到麻烦 如果我有一个用于一些可配置变量的简单模块(例如,我可能希望将其替换为测试环境) 另一个模块依赖于它,例如 @Module( injects = { TopLevelClass.class } ) public class DependentModule { @Inject @Named("ConfigO
@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
比较合适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";
}
}
@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();
}
}
addsTo
与ObjectGraph.plus(对象…模块)
一起使用。当图形已经创建并且包含一些模块(例如在应用程序类中)时,您可以使用plus
创建新图形(例如在活动中)。例如:
@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";
}
}
@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();
}
}
@Module()
公共类应用程序模块{
@提供@Named(“ValueA”)字符串provideValueA(){
返回“这是ValueA”;
}
}
@模块(
addsTo=ApplicationModule.class
)
公共类活动模块{
//ValueA来自ApplicationModule
@提供@Named(“ValueB”)字符串provideValueB(@Named(“ValueA”)字符串ValueA){
返回值A+“和值B”;
}
}
公共类DemoApplication扩展了应用程序{
私有对象图;
@重写公共void onCreate(){
super.onCreate();
graph=ObjectGraph.create(getModules().toArray());
}
受保护的列表getModules(){
返回数组.asList(
新的应用程序模块()
);
}
公共无效注入(对象){
图形注入(对象);
}
公共对象图getObjectGraph(){
返回图;
}
}
公共类DemoActivity扩展了活动{
私有对象图活动图;
@在创建时覆盖受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//通过在应用程序图上添加模块来创建活动图。
DemoApplication应用程序=(DemoApplication)getApplication();
activityGraph=application.getApplicationGraph().plus(新的ActivityModule());
//注入我们自己,这样子类将在该方法返回时满足依赖关系。
activityGraph.Injection(此);
}
@重写受保护的void onDestroy(){
//急切地清除对活动图的引用,以便将其作为垃圾收集
//尽快。
activityGraph=null;
super.ondestory();
}
}
您还可以查看示例以创建图的作用域。嘿,非常感谢您的帮助。很抱歉这么晚才批准,我还得扑灭一些火。我不确定我是否100%清楚这方面的所有内容,但将
includes
与可注入的提供方法结合使用(我不知道您可以这么做!)就足够了。