繁体   English   中英

将依赖项注入Singleton Dagger 2.11

[英]Inject dependencies into Singleton Dagger 2.11

我有应用程序级作用域的Singleton类TaskRepositoryAppConfig ,它们具有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;
    }
}

AppComponent

@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();
}
}

TaskRepository类

@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

}

AppConfig类别

@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM