更改对代理的绑定
Change a binding to a proxy
我创建了一个代理 class 使用 APT(注释处理器)在原始 class 中做一些检测。
当实现 class 使用 @MyCustomAnnotation 注释时,我想使用此代理而不是默认实现更改 Dagger 2 中的绑定。
实施(由用户):
@MyCustomAnnotation
public class MyServiceImpl implements MyService {
// Implementation
}
原始模块:
@Module
public class AppModule {
@Provides
@Singleton
MyService providesService() {
return new MyServiceImpl();
}
}
替换实现的最终模块:
@Module
public class AppModule {
@Provides
@Singleton
MyService providesService() {
return new MyServiceImplProxy();
}
}
我需要从用户角度来看透明的东西。
你们有什么建议?
好吧,我最终使用了@Binds 并进行了双重绑定。
将用户模块更改为简单的@Binds:
@Module(includes = { OverrideModule.class })
public abstract class AppModule {
@Binds
@Singleton
abstract MyService providesMyService(MyServiceImpl impl);
}
并创建了一个覆盖模块:
@Module
public abstract class OverrideModule {
@Binds
abstract MyServiceImpl providesMyServiceImpl(MyServiceImplProxy impl);
}
我创建了一个代理 class 使用 APT(注释处理器)在原始 class 中做一些检测。
当实现 class 使用 @MyCustomAnnotation 注释时,我想使用此代理而不是默认实现更改 Dagger 2 中的绑定。
实施(由用户):
@MyCustomAnnotation
public class MyServiceImpl implements MyService {
// Implementation
}
原始模块:
@Module
public class AppModule {
@Provides
@Singleton
MyService providesService() {
return new MyServiceImpl();
}
}
替换实现的最终模块:
@Module
public class AppModule {
@Provides
@Singleton
MyService providesService() {
return new MyServiceImplProxy();
}
}
我需要从用户角度来看透明的东西。
你们有什么建议?
好吧,我最终使用了@Binds 并进行了双重绑定。
将用户模块更改为简单的@Binds:
@Module(includes = { OverrideModule.class })
public abstract class AppModule {
@Binds
@Singleton
abstract MyService providesMyService(MyServiceImpl impl);
}
并创建了一个覆盖模块:
@Module
public abstract class OverrideModule {
@Binds
abstract MyServiceImpl providesMyServiceImpl(MyServiceImplProxy impl);
}