我開始在我正在開發的應用程序中使用Dagger 2,但我對於Dagger 2的工作原理有一些疑問。Dagger 2注入構造函數
我得到@Provides方法背後的所有邏輯和用於初始化依賴項的@Inject註解,但@Inject對類構造函數的註解類似於我的想法。
例如:
林我的應用程序,我一個模塊定義的,ContextModule,檢索我的申請的上下文中:
ContextModule.java
@Module
public class ContextModule {
private final Context context;
public ContextModule(Context context) {
this.context = context;
}
@Provides
public Context context() {
return this.context;
}
}
該模塊用於通過我的BaseActivityComponent:
BaseActivityComponent.java
@BaseActivityScope
@Component(modules = ContextModule.class)
public interface BaseActivityComponent {
void injectBaseActivity(BaseActivity baseActivity);
}
到目前爲止這麼好..然後我有一個AuthController類,這取決於上下文,我想注入它在我的BaseActivity。所以在我的AuthControllers.class我有類似:
public class AuthController {
private Context context;
@Inject
public AuthController(Context context) {
this.context = context;
}
public void auth() {
// DO STUFF WITH CONTEXT
}
}
我把它注射在我BaseActivity這樣的:
public class BaseActivity extends AppCompatActivity {
@Inject
AuthController authController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BaseActivityComponent component = DaggerBaseActivityComponent.builder()
.contextModule(new ContextModule(this))
.build();
component.injectBaseActivity(this);
authController.auth();
}
}
現在的問題是,如何做匕首知道我AuthControllers是依賴BaseActivity?只需通過聲明
@Inject
AuthController authController;
是一樣的東西,如果我創建了一個ControllerModule,如:
@Module(includes = ContextModule.class)
public class ControllerModule {
@Provides
AuthController authController(Context context) {
return new AuthController(context);
}
}
然後在我的BaseActivityComponent我想補充我的AuthController getter和改變我的依賴模塊ControllersModule:
@BaseActivityScope
@Component(modules = ControllersModule.class)
public interface BaseActivityComponent {
void injectBaseActivity(BaseActivity baseActivity);
AuthController getAuthController();
}
當我調用injectBaseActivity(this)它「告訴」匕首所有@Inject註釋是我的類的依賴關係,然後它搜索我的項目ct爲@Inject註釋的構造函數匹配該類型?
我認爲Dagger 2的一個好處就是Module文件可以用作我的依賴關係的「文檔」。但是,如果只是在我控制的所有構造函數中添加@Inject,將來會不會有點困惑,因爲你不知道什麼取決於什麼? (我的意思是,你知道什麼取決於什麼,你只需瀏覽大量的文件,以真正找出)
有沒有什麼最佳做法,當在構造函數中使用@Inject註釋或何時添加@Provides方法在模塊文件? 我在構造函數中使用@Inject我不需要更改我的模塊文件中的構造函數定義,但有什麼缺點嗎?
謝謝。
真棒的答案。你知道是否有可能用注入註釋Kotlin默認構造函數(用類定義定義的構造函數)? –
@saiedVanguard這是可能的:'類A @Inject構造函數(...)' –