Adn*_*lla 21 java android dependency-injection dagger-2
我正在尝试使用Dagger2进行DI,它对于有onCreate生命周期事件的Activity/Fragment相关类非常适用.现在我有一个普通的Java类,我想要注入它.任何关于如何去做的想法将不胜感激.我的代码看起来像这样:
BasicMoviesUsecaseComponent.java -
@PerActivity
@Component(dependencies = AppComponent.class, modules = BasicMoviesUsecasesModule.class)
public interface BasicMoviesUsecasesComponent {
void inject(PaymentsManager paymentsManager);
}
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
AppComponent.java -
@Singleton
@Component(modules = {
ApplicationModule.class,
DomainModule.class,
DatabaseModule.class
})
public interface AppComponent {
Bus bus();
Realm realm();
DatabaseProvider dbProvider();
SharedPreferencesManager sharedPreferencesManager();
}
Run Code Online (Sandbox Code Playgroud)
这是我需要将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);
}
}
Run Code Online (Sandbox Code Playgroud)
我如何调用initializeDependencyInjector()?
Dav*_*jak 44
通常应尽可能使用构造函数注入.调用component.inject(myObject)
主要用于无法自己实例化的对象(如活动或片段).
构造函数注入基本上就是你已经做过的:
private class MyManager {
private SharedPreferencesManager manager;
@Inject
MyManager(SharedPreferencesManager manager){
this.manager = manager;
}
}
Run Code Online (Sandbox Code Playgroud)
匕首会为你创造物品并传递给你SharedPreferencesManager
.无需调用init或类似的东西.
真正的问题是如何获得一个对象MyManager
.为此,再次,匕首会为你处理它.
通过注释构造函数,@Inject
告诉dagger如何创建该类型的对象.要使用它,只需注入它或将其声明为依赖项.
private class MyActivity extends Activity {
@Inject
MyManager manager;
public void onCreate(Bundle savedState){
component.inject(this);
}
}
Run Code Online (Sandbox Code Playgroud)
或者只是将一个getter添加到组件中(只要SharedPreferenceManager
可以提供,MyManager
也可以实例化):
@Component(dependencies = SharedPreferenceManagerProvidingComponent.class)
public interface MyComponent {
MyManager getMyManager();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10677 次 |
最近记录: |