带有参数的DRY Custom Guice Provider

时间:2017-02-08 07:07:32

标签: java dependency-injection guice

我需要在不同的地方注入X的多个实例。 我实现了一个自定义Guice Provider来提供类X的不同实例,如下所示。

public class XProvider implements Provider<X> {
    private final Factory f;
    private final String NAME = "Something String";

    @Inject
    public XProvider(Factory f) {
       this.f = f;
    }

    public X get() {
        return new X(f, NAME);
    }
}

因为我需要具有不同NAME值的不同X实例,所以我需要有多个相似的类 像XProvider1,XProvider2等只在一个领域不同。 创建一个抽象类来扩展自己没有帮助减少冗余代码的数量,因为(1)隐藏字段不好 (2)如果我不隐藏字段,我仍然需要在子类中使用构造函数。

我无法使用辅助注射,因为我不拥有X所以我改变了它的构造函数。

必须有更好的方法来实现它,或者使用Guice或其他方法来重构我的代码。 我在这里寻找一些改变建议。

谢谢,

1 个答案:

答案 0 :(得分:1)

如果您有预定义的有限可能参数集,则可以在guice模块中使用命名的@Provides绑定:

    startHandCountFile = open("startHandCount", "rb")
    self.startHandCount = pickle.load(startHandCountFile)
    self.currentStartHandCount = self.startHandCount
    self.startHandCount[startingTotal][1] += 1
    print("print still working")
    startHandCountFile.close()

    startHandCountFile = open("startHandCount", 'wb')
    pickle.dump(self.currentStartHandCount, startHandCountFile)
    startHandCountFile.close()

然后将其注入名称

@Provides @Named("Type 1") MyClass getType1() {return new MyClass("Param of type 1");}
@Provides @Named("Type 2") MyClass getType2() {return new MyClass("Param of type 2");}

PS。您可以将任何可注入参数传递给@Provides方法,即getType2(工厂工厂){return ...