我正在尝试将Dagger2用于DI,它对于存在onCreate生命周期事件的Activity /
Fragment相关类非常有效。现在,我有一个普通的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()?
通常应该尽可能使用构造函数注入。对的调用component.inject(myObject)
主要用于无法实例化自己的对象(如活动或片段)。
构造函数注入基本上就是您已经做过的:
private class MyManager {
private SharedPreferencesManager manager;
@Inject
MyManager(SharedPreferencesManager manager){
this.manager = manager;
}
}
Dagger将为您创建对象并传递给您SharedPreferencesManager
。不需要调用init或类似的东西。
真正的问题是如何 获得 的对象MyManager
。为此,匕首将再次为您处理。
通过注释构造函数,@Inject
您可以告诉dagger如何创建该类型的对象。要使用它,只需注入它或将其声明为依赖项。
private class MyActivity extends Activity {
@Inject
MyManager manager;
public void onCreate(Bundle savedState){
component.inject(this);
}
}
或仅向组件添加吸气剂(只要SharedPreferenceManager
可以提供,MyManager
也可以实例化):
@Component(dependencies = SharedPreferenceManagerProvidingComponent.class)
public interface MyComponent {
MyManager getMyManager();
}
从Dagger2文档中,我注意到您可以有一个注释类。将类标记为的目的是什么,因为我在代码中尝试过这样做,但没有生成singleton对象。我不清楚用这个注释标记我的类有什么用。 从文档中,请关注以下声明: injectable类上的@Singleton注释也可用作文档。它提醒潜在的维护者,该类可能由多个线程共享。*
我刚开始使用Dagger并尝试使用dagger2进行DI,但看起来它给我的活动注入了一个空演示器。下面是我的代码。 公共类TasksActivity扩展AppCompatActivity{
我学习了Dagger2,并尝试使用MVVM制作应用程序。我根据方案创建了Dagger类(模块、组件、BaseApplication),但当我尝试将QuotableAPI对象注入ViewModel时,Dagger不会生成DaggerAppComponent类(在ViewModel构造函数中没有QuotableAPI生成)。 报价视图模型 应用程序模块 应用组件 基础应用 ViewModelFacto
嗨,当我尝试在下面的类中注入Doa接口时,我正在使用mvvm和dagger2 我的接口类
我试图将一组房间组件注入存储库,存储库本身使用Dagger2注入ViewModel(在片段中)。 代码如下。 片段: 视图模型: 我的存储库: 最后,对于我的匕首类,我有两个模块: 和我的AppComponent: Dagger编译正常,我可以访问并构建它。但是是不可访问的(检查类将其显示为私有),我需要实际注入依赖项的方法也是如此。结果我得到错误: 我该如何解决这个问题?
问题内容: 我是在暗示我的Android应用程序。我通过以下方式进行设置: AppComponent.java AppInjector.java AppModule.java 最后在 MyApplication.Java 中,我只是这样调用该方法: 所有这些工作以及我放入AppComponent模块中的所有内容都可以注入。 但是,在某些情况下,我需要一个依赖于for 的类,并且在各种地方都使用实用