我正在使用Guice,我处于这种情况,我需要获取给定接口的特定实现,具体取决于某个参数。与setter / controller注入不同,我会在方法中请求实例,只有在调用方法时才知道参数的值。
我可以解决我的问题,使用经典工厂对象并注入工厂实例,我通常会在其中注入实现实例。我查看了Guice的提供程序,它们最初看起来很有前景,但似乎无法将参数传递给get()方法。
这是你怎么解决这个问题的?
答案 0 :(得分:0)
Guice为名为Assisted Inject
的第一种方法提供工厂助手但是,有可能使用Custom scopes做得更好。
我们的想法是seed
对象注入依赖于Provider的参数。
看起来像是:
模块:
bind(CommandProperty.class).toProvider(ExchangeScope.<CommandProperty>seededKeyProvider()).in(ExchangeScope.class); //<< this is missing in tutorial
范围代码:
scope.enter();
try {
// explicitly seed some seed objects...
scope.seed(Key.get(CommandProperty.class), commandPropertyInstance);
// create and access scoped objects
runnable.run();
} finally {
scope.exit();
}
提供者:
private Provider<CommandProperty> commandPropertyProvider;
private Map<CommandProperty, Provider<Object>> objectProviderMap;
@Inject
public ObjectProvider(Provider<CommandProperty> commandPropertyProvider, Map<CommandProperty, Provider<Object>> objectProviderMap) {
this.commandPropertyProvider = commandPropertyProvider;
this.objectProviderMap = objectProviderMap;
}
@Override
public CommandProperty get() {
CommandProperty commandP = commandPropertyProvider.get();
return objectProviderMap.get(commandP).get();
}
正如您所见,objectProviderMap
将在运行时出现并可以注入。不同的是你摆脱了工厂,你可以创建对象的构造函数/ setter方式。垮台是你必须保持更大的代码复杂性。我宁愿使用像代码库那样的核心或框架而不是应用程序级别。