Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 模块依赖于Dagger中的另一个模块_Java_Android_Dependency Injection_Dagger - Fatal编程技术网

Java 模块依赖于Dagger中的另一个模块

Java 模块依赖于Dagger中的另一个模块,java,android,dependency-injection,dagger,Java,Android,Dependency Injection,Dagger,我试图用它在我正在构建的一个应用程序上进行依赖注入,当我根据注入器提供的值(可能由另一个模块提供)拥有一个包的模块时,构建正确的DAG会遇到麻烦 如果我有一个用于一些可配置变量的简单模块(例如,我可能希望将其替换为测试环境) 另一个模块依赖于它,例如 @Module( injects = { TopLevelClass.class } ) public class DependentModule { @Inject @Named("ConfigO

我试图用它在我正在构建的一个应用程序上进行依赖注入,当我根据注入器提供的值(可能由另一个模块提供)拥有一个包的模块时,构建正确的DAG会遇到麻烦

如果我有一个用于一些可配置变量的简单模块(例如,我可能希望将其替换为测试环境)

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

@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
与可注入的提供方法结合使用(我不知道您可以这么做!)就足够了。