1

我有一个 A 类,它拥有这样的 B 类:

class A {
   private final B b;
   @Inject
   A(B b) {
     this.b = b;
   }
}

interface B {}
class B1 implements B {}
class B2 implements B {}

class Client() {
   @Inject 
   Client(@AhasB1 A aHasB1, @AhasB2 A aHasB2) { }
}

我想绑定两个不同的 A,一个是带注释的@AhasB1,另一个是@AhasB2. 我怎样才能正确绑定这些?

4

3 回答 3

3

这是我使用PrivateModule.

public class MainModule extends AbstractModule {
    @Override
    protected void configure() {
        install(new PrivateModule(){
            @Override
            protected void configure() {
                bind(A.class).annotatedWith(AhasB1.class).to(A.class);
                expose(A.class).annotatedWith(AhasB1.class);
                bind(B.class).to(B1.class);
            }
        });

        install(new PrivateModule(){
            @Override
            protected void configure() {
                bind(A.class).annotatedWith(AhasB2.class).to(A.class);
                expose(A.class).annotatedWith(AhasB2.class);
                bind(B.class).to(B2.class);
            }
        });
}
于 2011-07-31T13:39:45.773 回答
1

不要使用@Provides方法,而是考虑一组Provider<A>类型,可能嵌套在类型 A 中,授予您访问私有 ctor 的权限。或者将其设为受包保护的 ctor,并将提供程序放在与其相同的包中。或者,当然,您可以将您的 Module 类型移动到与 A 相同的包中。

另一个选项是AssistedInject,它允许您指定一组方法,这些方法将根据名称或参数返回不同的实例(在您的情况下,可能是 A 的子类型)。我认为它将可以访问私有构造函数。

最后一个想法:为什么不让 A 的构造函数公开,以便库的用户可以手动注入依赖项?如果这仅供内部使用,则记录 ctor 也足够了。

于 2011-07-25T02:07:34.070 回答
1

我认为您正在寻找的解决方案是 Private Modules

  1. 您将需要两个 PrivateModule 实例,B1 和 B2 各一个
  2. 将 B 绑定到适当的具体类型
  3. expose(A.class).annotatedWith(B1.class)

http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/PrivateModule.html

-dg

于 2011-07-30T05:47:03.487 回答