Để tìm hiểu Dagger 2 tôi quyết định viết lại ứng dụng của mình nhưng tôi bị kẹt với việc tìm ra giải pháp thích hợp cho vấn đề sau.Dagger 2: cách thay đổi các phụ thuộc được cung cấp trong thời gian chạy
Đối với mục đích của ví dụ này chúng ta hãy giả sử chúng ta có một giao diện được gọi Mode
:
public interface Mode {
Object1 obj1();
//some other methods providing objects for app
}
và hai triển khai: NormalMode
và DemoMode
.
Chế độ được lưu trữ ở dạng đơn để có thể truy cập từ mọi nơi trong ứng dụng.
public enum ModeManager {
INSTANCE,;
private Mode mode;
public Mode mode() {
if (mode == null)
mode = new NormalMode();
return mode;
}
public void mode(Mode mode) { //to switch modules at runtime
this.mode = mode;
}
}
Các NormalMode
được chuyển sang DemoMode
lúc runtime (giả sử, khi clickcs người dùng trên vài nền lần)
public void backgroundClicked5Times(){
ModeManager.INSTANCE.mode(new DemoMode());
//from now on every object that uses Mode will get Demo implementations, great!
}
Vì vậy, đầu tiên tôi đã thoát khỏi những singleton và xác định chế độ như Dagger 2 mô-đun:
@Module
public class NormalModeModule {
@Provides
public Object1 provideObject1() {
return new NormalObject1();
}
}
@Module
public class DemoModeModule {
@Provides
public Object1 provideObject1() {
return new DemoObject1();
}
}
Bây giờ trong phương pháp backgroundClicked5Times
trong thay vì giao dịch với singleton tôi muốn thay thế NormalModeModule
bằng DemoModeModule
trong DAG để các lớp khác cần Object1
sẽ nhận được thực thi DemoObject1
kể từ bây giờ.
Tôi có thể làm điều đó như thế nào trong Dagger?
Xin cảm ơn trước.
có thể trùng lặp của [mô-đun với Dagger thể thay thế nhanh 2] (https://stackoverflow.com/questions/35658488/swappable-modules-with-dagger-2) – tir38