Как можно использовать Dagger 2 для инъекции нескольких компонентов в один и тот же объект
поэтому у меня есть ApplicationComponent для инъекции синглетов в мои фрагменты и презентеры, но я пытаюсь создать компонент для инъекции в тот же презентатор, что и AppComponent. Что-то в этом роде.
@Component{modules = FileManagerModule.class}
public interface FileManagerComponet
{
public void inject(MyPresenter presenter);
}
@Component{modules = AppModule.class}
public interface AppComponent
{
public void inject(MyPresenter presenter);
}
@Module
public class AppModule
{
private Context appContext;
@Provides
@Singleton
public SharedPreferences preferences()
{
return appContext.sharedPreferences();
}
...
}
@Module
public class FileManagerModule
{
private Context activityContext;
@Provides
public FileManager FileManager()
{
return new FileManager(activityContext);
}
...
}
1 ответов
для тех, кто не может понять это, один компонент должен предоставить все зависимости для объекта. Поэтому в моем случае я должен был бы сделать FileManagerComponent Субкомпонентом и".plus()
" это с моим AppComponent, или сделать его зависимым от AppComponent и иметь AppComponent выставить контекст вниз по течению, имея Context context();
метод, который позволит компонентам, зависящим от него, иметь доступ к контексту, который он имеет.
например:
@Singleton
@Component(modules = {NetworkModule.class, AndroidModule.class})
public interface ApplicationComponent {
FileManagerComponent plus(FileManagerModule module);
}
@Subcomponent(modules = {FileManagerModule.class})
public interface FileManagerComponent {
void injectMyActivity(MyFileManagingActivity activity);
}
и вы бы использовали его вот так (в MyFileManagingActivity):
FileManagerComponent fmc = applicationComponent.plus(new FileManagerModule());
fmc.injectMyActivity(this);
или если вы не хотите использовать субкомпоненты что-то вроде этого:
@Singleton
@Component(modules = {NetworkModule.class, AndroidModule.class})
public interface ApplicationComponent {
Context context();
File applicationRootDirectory();
}
// Notice this is ALSO a Component
@Component(modules = {FileManagerModule.class}, dependencies = ApplicationComponent.class)
public interface FileManagerComponent {
void inject(MyFileManagerActivity activity);
}
теперь вам нужно создать свой компонент, который зависит от компонента приложения.
FileManagerComponent fmc = DaggerFileManagerComponent.builder()
.applicationComponent(appComponent)
.fileManagerModule(new FileManagerModule())
.build();
fmc.inject(this);