簡體   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