我对Guice很新,一直试图看看我的问题是否可以与Guice解决。我有一个主要的Driver类,看起来像这样:
public class Driver{
execute(){
Manager m = injector.getInstance(Manager.class);
}
}
public class Manager{
private List<IExecutor> executors;
@Inject
public Manager(IExecutorWrapper executor){
this.executors = executor.getExecutors();
}
public List<IExecutor> getExecutors() {
return executors;
}
}
我的IExecutorWrapper类有多个实现,每个实现都有自己的IExecutors列表。在运行时只选择1, 选择哪种实现取决于上下文的逻辑。什么是最好的设计方法,这样我的Driver类 不需要改变?我的GuiceModule将如何?
谢谢!
答案 0 :(得分:0)
如果为每个请求创建了管理器,则可以使用自定义提供程序来实现此目的。
如果Context
是可注射的(可能是请求范围的服务):
@Provides
IExecutorWrapper createIExecutorWrapper(Context context) {
if (context.isXX()) {
return new Executor1();
} else {
return new Executor2();
}
}
如果IiceecutorWrapper的实现应该由Guice注入,那么你可以注释每个实现类型,并注入提供者:
@Provides
IExecutorWrapper createIExecutorWrapper(Context context,
@Type1 Provider<IExecturoWrapper> type1,
@Type2 Provider<IExecutorWrapper> type2) {
if (context.isXXX()) {
return type1.get();
} else {
return type2.get();
}
}
和配置:
bind(IExecutorWrapper.class).annotatedWith(Type1.class).to(Executor1.class);
bind(IExecutorWrapper.class).annotatedWith(Type2.class).to(Executor2.class);