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

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

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

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

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

编辑1

@ jeff-bowman我在考虑使用以下方法:

 @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(); } } 

这是一个好习惯吗?

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

 /** 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 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调用此辅助注入 ,并提供FactoryModuleBuilder (通过可选的扩展JAR),在运行时reflection生成工厂。 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的依赖关系,或者将此类的其他实现替换为依赖它的类,则可以完全保留该类,并将该调用视为工厂。)