Внедрение кинжала 2 в классе Java
Я пытаюсь использовать Dagger2 для DI, он отлично работает для классов, связанных с Activity/Fragment, где есть событие onCreate lifecycle. Теперь у меня есть простой Java-класс, который я хочу ввести. Любые идеи относительно того, как это сделать, будут оценены. Код, который у меня есть, выглядит следующим образом:
BasicMoviesUsecaseComponent.java -
@PerActivity
@Component(dependencies = AppComponent.class, modules = BasicMoviesUsecasesModule.class)
public interface BasicMoviesUsecasesComponent {
void inject(PaymentsManager paymentsManager);
}
DatabaseModule.java -
@Module
public class DatabaseModule {
@Provides @Singleton
Realm provideRealmInstance(Context context) {
return Realm.getInstance(context);
}
@Provides @Singleton
DatabaseProvider provideDatabaseInstance(Realm realm) {
return new DatabaseProvider(realm);
}
@Provides @Singleton
SharedPreferences provideSharedPrefs(Context context) {
return context.getSharedPreferences(context.getPackageName()+"_prefs", Context.MODE_PRIVATE);
}
@Provides @Singleton
SharedPreferencesManager provideSharedPreferencesManager(SharedPreferences sharedPreferences) {
return new SharedPreferencesManager(sharedPreferences);
}
@Provides @Singleton
PaymentsManager providePaymentsManager(SharedPreferencesManager sharedPreferencesManager) {
return new PaymentsManager(sharedPreferencesManager);
}
}
AppComponent.java -
@Singleton
@Component(modules = {
ApplicationModule.class,
DomainModule.class,
DatabaseModule.class
})
public interface AppComponent {
Bus bus();
Realm realm();
DatabaseProvider dbProvider();
SharedPreferencesManager sharedPreferencesManager();
}
Вот класс, который мне нужно ввести SharedPreferencesManager, и я не могу этого сделать:
MyManager.java -
private class MyManager {
private SharedPreferencesManager manager;
@Inject
MyManager(SharedPreferencesManager manager){
this.manager = manager;
}
private void initializeDependencyInjector() {
BMSApplication app = BMSApplication.getInstance();
DaggerBasicMoviesUsecasesComponent.builder()
.appComponent(app.getAppComponent())
.basicMoviesUsecasesModule(new BasicMoviesUsecasesModule())
.build().inject(PaymentsManager.this);
}
}
Как я могу вызвать initializeDependencyInjector()?
Ответы
Ответ 1
Обычно вам следует использовать конструкторную инъекцию. Вызов component.inject(myObject)
в основном используется для объектов, которые вы не можете создать самостоятельно (например, действия или фрагменты).
Инъекция конструктора - это в основном то, что вы уже сделали:
private class MyManager {
private SharedPreferencesManager manager;
@Inject
MyManager(SharedPreferencesManager manager){
this.manager = manager;
}
}
Кинжал создаст объект для вас и передаст ваш SharedPreferencesManager
. Нет необходимости вызывать init или что-то подобное.
Реальный вопрос - как получить объект MyManager
. Чтобы сделать это, снова, кинжал будет обрабатывать его для вас.
@Inject
конструктор с помощью @Inject
вы @Inject
кинжал, как он может создать объект этого типа. Чтобы использовать его, просто введите его или объявите его как зависимость.
private class MyActivity extends Activity {
@Inject
MyManager manager;
public void onCreate(Bundle savedState){
component.inject(this);
}
}
Или просто добавьте getter к компоненту (при условии, что SharedPreferenceManager
может быть предоставлен, MyManager
также может быть MyManager
):
@Component(dependencies = SharedPreferenceManagerProvidingComponent.class)
public interface MyComponent {
MyManager getMyManager();
}