Google Guice

时间:2015-12-24 02:59:06

标签: java dependency-injection guice

我最近开始使用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());
    }

}

工厂班给了我一个子弹但我只是想知道他们是一个更好的方法吗?

1 个答案:

答案 0 :(得分:3)

从现有代码开始

@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而不是多个绑定器(传递String类型并立即将其从多绑定器中拉出来感觉有点尴尬)但这应该工作