在创建Guice注入器时,我们是否需要模块用于间接依赖?

时间:2012-07-06 15:53:22

标签: dependency-injection guice

当创建一个注入器来创建一个对象时,我们是否需要为其间接依赖项包含模块?

例如,在下面的代码中,我们应该如何在main()中创建注入器?

public class Foo {
    private Bar bar;

    @Inject
    public Foo(Bar bar) {
        this.bar = bar;
    }

    public static void main(String[] argv) {
        Injector injector = Guice.getInjector(new BarModule());
        // or Injector injector = Guice.getInjector(new BarModule(), new BarDepModule());
        Foo foo = injector.getInstance(Foo.class);
    }
}

//=====================
public interface Bar {}

public class BarImp {
    private BarDep barDep; // Dependency of Bar

    @Inject
    public Bar(BarDep barDep) {
        this.barDep = barDep;
    }
}
//=====================

当然,BarDep应该有绑定。问题是我们应该明确加载BarDepModule还是应该由BarModule负责呢?

2 个答案:

答案 0 :(得分:0)

弗雷德·费伯(Fred Faber)发表了一篇很好的演讲,内容涵盖了一些最佳实践(但我无法在网上找到幻灯片)。他的建议是垂直构建模块安装:最高级别的组件负责安装所有依赖项。在这种情况下,main应绑定BarModule和BarDepModule。将来,如果你有一些NachoModule也恰好依赖于BarDepModule,你就不会遇到绑定冲突,如果采用这种方法......

答案 1 :(得分:0)

是的,这正是策略。使用最高级别的模块安装依赖项可以清楚地了解服务器/应用程序的配置方式。这有助于读者了解服务器的配置方式,并消除潜在的绑定冲突(如Nacho示例所示)。演示文稿的幻灯片位于:http://bit.ly/BigGuice2011