我有一个在构造函数中获取参数的类:
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();
}
}
这是一个好习惯吗?
答案 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}作为工厂。)