如何使用Dagger2实例化具有动态成员的对象?

时间:2017-02-15 13:43:09

标签: java android dagger-2

我有一个在构造函数中获取参数的类:

public class Dependency{
  Dependency(int number1, int number2, int number3, DependencyListener listener){}     
}

每个依赖类需要路径不同的参数才能实例化依赖项。 我应该如何定义模块和其他类可以在传输不同值并将“this”作为侦听器传递时正确启动它的组件?

另外,在这种情况下我应该如何使用@Inject方法?

修改1

@杰夫-鲍曼 我在考虑使用以下方法:

@Module public class DependencyModule {
  int first;
  int second;
  int third;
  DependencyListener listener;

  public DependencyModule(int first, int second, int third, DependencyListener listener) {
    this.first = first;
    this.second = second;
    this.third = third;
    this.listener = listener
  }

  @Provides Dependency provideDependency(int first, int second, int third, DependencyListener listener) {
    return new Dependency(first, second, third, listener)
  }
}

@Component(modules = { DependencyModule.class }) public interface     
DependencyComponent {
  void inject(DependentClass1 target);
  void inject(DependentClass2 target);
  void inject(DependentClass3 target);
}

在每个DependentClass中我会这样做:

public class DependentClass{
  @Inject Dependency;
  public DependentClass{
      DaggerDependencyComponent.builder().dependencyModule(new DependencyModule(first, second, third, this)).build().inject();
  }
}

这是一个好习惯吗?

1 个答案:

答案 0 :(得分:1)

从概念上讲,你想要的是工厂:

/** Inject this wherever you want an instance of Dependency. */
public interface DependencyFactory {
  Dependency create(
      int number1,
      int number2,
      int number3,
      DependencyListener listener);
}

public class DependencyFactoryImpl implements DependencyFactory {
  @Inject Provider<SomeDaggerDepIfNeeded> someDaggerDepProvider;

  @Override public void create(
      int number1,
      int number2,
      int number3,
      DependencyListener listener) {
    return new Dependency(number1, number2, number3, listener,
        someDaggerDepProvider.get() /* if necessary */);
  }
}

但是,由于这很容易自动生成,因此通常会有内置工具。 Guice 调用此Assisted Injection,并提供FactoryModuleBuilder(通过可选的扩展JAR),在运行时反射生成工厂。 Dagger 2 没有内置的等价物,主要是因为Google已经发布了一个名为 AutoFactory 的开源JSR-330工厂生成器, 任何 JSR-330实施的工厂,包括Dagger,Guice和Spring。

@AutoFactory
public class Dependency{
  Dependency(
      int number1, int number2, int number3, DependencyListener listener,
      @Provided SomeDaggerDepIfNeeded somedaggerDep){}     
}

有关其调用的详细信息,请参阅AutoFactory文档,特别是如果您对生成的工厂实现接口感兴趣的话。使用您明确定义的接口可以更轻松地使用IDE中生成的代码。

(如果您不需要Dagger的依赖项,或者将此类的其他实现替换为依赖它的类,则可以完全保留该类,并将调用视为{{1}作为工厂。)