Это сложный вопрос, потому что вы думаете, что Dagger в первую очередь решает проблему, заключающуюся в том, что теперь вам больше не нужно вводить классы «Фабрика» для переконфигурирования поведения.
Однако вам все равно нужноиспользуйте классы "Фабрика" для создания объектов с динамическими аргументами конструктора , полученными во время выполнения.
Итак:
public class NetworkDataSource {
@Inject
public NetworkDataSource(String url, String method) {
this.url = url;
this.method = method;
}
}
будет
@Singleton
public class NetworkDataSourceFactory {
private final OkHttpClient okHttpClient;
private final Gson gson;
@Inject
public NetworkDataSourceFactory(OkHttpClient okHttpClient, Gson gson) {
this.okHttpClient = okHttpClient;
this.gson = gson;
}
public NetworkDataSource create(String url, String method) {
return new NetworkDataSource(okHttpClient, gson, url, method);
}
}
Тогда теперь вы можете ввести NetworkDataSourceFactory
и создать NetworkDataSource
, когда получите аргументы:
@Inject NetworkDataSourceFactory factory;
....
networkDataSource = factory.create(url, method);
Предположительно, вы можете использовать AutoFactory
, чтобы помочь с созданием фабрики, но у меня нетЯ еще не использовал его, все, что я знаю, это то, что он существует для этого конкретного варианта использования.
РЕДАКТИРОВАТЬ: вы также можете проверить https://github.com/square/AssistedInject, чтобы помочь с этой проблемой.