Guice:在运行时有条件地实例化一个接口(在许多接口中)的 1 个具体实现
Guice : conditionally instantiate 1 concrete implementation of an interface (among many) at runtime
我是 Guice 的新手,一直在尝试看看我的问题是否可以用 Guice 解决。我有一个主驱动程序 class,看起来像这样:
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 class 有多个实现,每个实现都有自己的 IExecutors 列表。在运行时只选择 1,
选择哪个实现的逻辑取决于上下文。什么是最好的设计方法,使我的驱动程序 class
不需要改变?我的 GuiceModule 会是什么样子?
谢谢!
如果为每个请求创建管理器,您可以使用自定义提供程序来实现此目的。
如果 Context
是可注入的(并且可能是请求范围内的服务):
@Provides
IExecutorWrapper createIExecutorWrapper(Context context) {
if (context.isXX()) {
return new Executor1();
} else {
return new Executor2();
}
}
如果 IExecutorWrapper 的实现应该由 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);
我是 Guice 的新手,一直在尝试看看我的问题是否可以用 Guice 解决。我有一个主驱动程序 class,看起来像这样:
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 class 有多个实现,每个实现都有自己的 IExecutors 列表。在运行时只选择 1, 选择哪个实现的逻辑取决于上下文。什么是最好的设计方法,使我的驱动程序 class 不需要改变?我的 GuiceModule 会是什么样子?
谢谢!
如果为每个请求创建管理器,您可以使用自定义提供程序来实现此目的。
如果 Context
是可注入的(并且可能是请求范围内的服务):
@Provides
IExecutorWrapper createIExecutorWrapper(Context context) {
if (context.isXX()) {
return new Executor1();
} else {
return new Executor2();
}
}
如果 IExecutorWrapper 的实现应该由 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);