Ответ 1
По-моему, на самом деле нет смысла вводить в модуль. Все модули объявляются как complete=false, library=true
в соответствии с определением модулей Dagger1, что означает, что вам не нужно указывать какую-либо реальную магию, пока вы включаете модули, которые не содержатся в компоненте, который вы используете, или создавайте зависимости компонента ссылаются друг на друга таким образом, что каждая зависимость, которую вы можете вводить, указывается только в одном компоненте.
Вы получите зависимости от других модулей в параметрах конструктора. Вам нужно включить модуль в список includes
, или вам нужно, чтобы модуль был указан в вашем компоненте в той же области.
Правильный способ сделать это:
@Module
public class OkHttpModule {
@Provides
@ApplicationScope
public OkHttpClient okHttpClient() {
return new OkHttpClient();
}
}
@Module
public class GsonModule {
@Provides
@ApplicationScope
public Gson gson() {
return new Gson();
}
}
@Module(includes={GsonModule.class, OkHttpModule.class}) //look closely, this is the magic
public class RetrofitModule {
@Provides
@ApplicationScope
public VeentsMeAPI veentsMeAPI(Gson gson, OkHttpClient okHttpClient) { //dependencies!
return RestAdapter.Builder()
.setClient(new Client(okHttpClient))
.setConverter(new GsonConverter(gson))
.create(VeentsMeAPI.class);
}
}
И тогда это
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ApplicationScope {}
Тогда
@ApplicationScope
@Component(modules={RetrofitModule.class}) //contains all other modules/dependencies
public interface AppComponent {
OkHttpClient okHttpClient();
Gson gson();
VeentsMeAPI veentsMeAPI();
void inject(Something something);
}
и
Затем вы получите созданный материал, и вам нужно будет собрать его вместе так
AppComponent appComponent = DaggerAppComponent.create();
//use appComponent.inject(stuff); with `void inject(Stuff stuff);` methods defined in AppComponent
Зависимости компонентов совпадают с подкомпонентами, поэтому они предназначены для подкопирования, а не для наследования зависимостей из той же области. Зависимости одной и той же области должны быть в одном компоненте, только в разных модулях.