[英]Inject dependencies into Singleton Dagger 2.11
我有应用程序级作用域的Singleton类TaskRepository和AppConfig ,它们具有Singleton类型的依赖关系。 在我的活动中,注入了TaskRepository
实例,但其所有字段均为空。
public class MVPApplication extends Application implements HasActivityInjector {
@Inject
DispatchingAndroidInjector<Activity> activityDispatchingAndroidInjector;
@Inject
TasksRepository tasksRepository;
@Inject
AppConfig appConfig;
private static MVPApplication instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
Realm.init(this);
DaggerAppComponent
.builder()
.application(this)
.realmBuilder(Realm.getDefaultInstance())
.build()
.inject(this);
}
@Override
public DispatchingAndroidInjector<Activity> activityInjector() {
return activityDispatchingAndroidInjector;
}
}
@Singleton
@Component(modules = {
AndroidInjectionModule.class,
AppModule.class,
ActivityBindingModule.class})
public interface AppComponent extends AndroidInjector<DaggerApplication> {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
@BindsInstance
Builder realmBuilder(Realm realm);
AppComponent build();
}
void inject(MVPApplication application);
TasksRepository getRepository();
AppConfig getAppConfig();
}
@Singleton
@Module
public class AppModule {
@Provides
@Singleton
TasksRepository provideTasksRepository() {
return new TasksRepository();
}
@Provides
@Singleton
AppConfig provideAppConfig() {
return new AppConfig();
}
}
@Singleton
public class TasksRepository implements RepositoryDatasource {
@Inject
Context mContext;
@Inject
AppConfig appConfig; //Singleton
@Inject
Realm realm; //Singleton
//There is no constructor. Only public functions using fields
}
@Singleton
public class AppConfig {
@Inject
Context mContext;
//There is no constructor. Only public functions using fields
}
请强调我的错误...任何帮助将不胜感激。 谢谢!
使用Dagger 2注入的主要类型有两种-字段注入和构造函数注入。 字段注入是在其中使用@Inject
注释活动或片段等类的字段,然后从Dagger 2组件显式请求注入的地方:
class MainActivity extends AppCompatActivity {
@Inject TasksRepository tasksRepository;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndroidInjector.inject(this); //explicit request for injection
}
}
注意,在onCreate
的第2行中,如果没有显式的注入请求,则taskRespository字段将保持为null
。
对于由Android OS实例化的类,例如Activity或Application字段注入是合适的。 对于其他人,包括您的存储库,最好使用构造函数注入。 为什么? 测试时,您可以通过构造函数和存根行为传递测试双打,也可以验证测试双打。
因此,要使其正常工作,您应该重构TasksRepository
以使用构造函数注入:
@Singleton
public class TasksRepository implements RepositoryDatasource {
private final Context context;
private final AppConfig appConfig;
private final Realm realm;
@Inject
TasksRepository(Context context, AppConfig appConfig, Realm realm) {
this.context = context;
this.appConfig = appConfig;
this.realm = realm;
}
请注意,此步骤将突出显示您在设置对象图时犯的任何错误。 因此,如果Dagger 2无法在TasksRepository
函数中提供3个参数中的任何一个,它将通过编译时消息通知您。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.