我最近开始使用Guice,需要一些帮助。
我有一个带有构造函数的类,其中包含了要注入的参数的3个不同的变体。下面是这个班
@Inject public Bullet(EntityParams entityParams, Movable movable, Renderable renderable) {
super(entityParams, movable, renderable);
}在这里,entityParams应该是辅助注射。
Movable接口有多个实现,因此需要使用一个MapBinder。
Renderable接口只有一个实现,所以没有问题。
我现在要做的是->
public class DefaultEntityFactory implements EntityFactory {
private final Provider<Renderable> renderableProvider;
private final Map<String, Movable> movableMap;
@Inject public DefaultEntityFactory(Provider<Renderable> renderableProvider, Map<String, Movable> movableMap) {
this.renderableProvider = renderableProvider;
this.movableMap = movableMap;
}
@Override
public Bullet create(EntityParams entityParams, String movableType) {
return new Bullet(entityParams, movableMap.get(movableType), renderableProvider.get());
}
}工厂的课程给了我一颗子弹,但我只是想知道,这是他们更好的方法吗?
发布于 2015-12-24 05:00:06
从现有代码开始
@Inject
public Bullet(
EntityParams entityParams,
Movable movable,
Renderable renderable) {
super(entityParams, movable, renderable);
}首先,我要处理地图活页夹。
@Inject
public Bullet(
EntityParams entityParams,
String movableType,
Map<String, Provider<Movable>> movables,
Renderable renderable) {
super(entityParams, movables.get(movableType), renderable);
}接下来,我将跟随AssistedInject帮助页面。https://github.com/google/guice/wiki/AssistedInject
首先,我添加了@Assisted注释。
@Inject
public Bullet(
@Assisted EntityParams entityParams,
@Assisted String MovableType,
Map<String, Provider<Movable>> movables,
Renderable renderable) {
super(entityParams, movables.get(movableType), renderable);
}然后创建工厂界面。
public interface BulletFactory {
public Bullet create(EntityParams entityParams, String movableType);
}把它绑在一起。
bind(BulletFactory.class)
.toProvider(FactoryProvider.newFactory(BulletFactory.class, Bullet.class));现在您可以注入一个BulletFactory来创建新的Bullet。
根据您的问题,最好是使用@Named而不是多绑定器(传入字符串类型并立即将其从多个绑定器中提取出来会感到有些尴尬),但这应该有效。
https://stackoverflow.com/questions/34446706
复制相似问题