我刚刚开始使用Dagger & 依赖注入,想知道一些低级依赖在运行时的配置。有没有办法在运行时为低级注入的Singleton提供一个配置对象?
我所追求的基本想法。
@Singleton
class DatabaseService {
@Inject
public DatabaseService(DatabaseConnectionConfig config) { // how can this arg be passed in at runtime?
// make the connection
}
}
@Singleton
class HighLevelService {
@Inject
public HighLevelService(DatabaseService db) {
}
}
@Module
class Module {
@Binds
abstract HighLevelService bindHighLevelService(HighLevelService svc);
@Binds
abstract DatabaseService bindDatabaseService(DatabaseService svc);
}
@Singleton
@Component(modules = {
Module.class
})
interface Factory {
HighLevelService highLevelService();
static Factory create() {
return DaggerFactory.create();
}
}
public class App {
public static void main(String[] args) {
// get the config details from the arguments
DatabaseConnectionConfig config = parseDBConfigFromArgs(args);
// is there a way to configure the DatabaseConnectionConfig from here?
HighLevelService svc = Factory.create().highLevelService();
}
}
你可以使用一个 @Component.Factory
(或 @Component.Builder
)与 @BindsInstance
.
@Singleton
@Component
interface Factory {
HighLevelService highLevelService();
// This nested interface is typically called "Factory", but I
// don't want to look up how to access Factory from Factory.Factory
@Component.Factory
interface MyFactory {
Factory create(@BindsInstance DatabaseConnectionConfig config);
}
static Factory create(DatabaseConnectionConfig config) {
return DaggerFactory.factory().create(config);
}
}
public class App {
public static void main(String[] args) {
DatabaseConnectionConfig config = parseDBConfigFromArgs(args);
HighLevelService svc = Factory.create(config).highLevelService();
}
}