1

假设我有 2 节课。

class A { ... }
class B {
 public B(A a) {...}
}

我想创建一个获取名称并需要为带注释的 B 创建绑定的模块:

class MyModule extends AbstractModule {
  String name;
  public MyModule(String name) { this.name = name; }

  public void configure() {
    // CREATE BINDING for @Named(name)B which depends on @Named(name)A
  }
}

为 B(或它的提供者)创建依赖于正确 A 的绑定的最佳方法是什么?

谢谢亚龙

4

2 回答 2

0

本周我在另一个 SO 线程中回答了一个非常相似的问题。

如果您知道要支持哪些注释,您将能够PrivateModule为每个注释创建一个,以便您可以公开 a@Named("c1") B以仅@Named("c1") A在需要绑定 A 的地方使用 a。

install(new PrivateModule() {
  @Override void configure() {
    // These are only bound within this module, and are not visible outside.
    bind(A.class).to(A1.class);
    // Though you can bind to other bindings which come from outside!
    bind(B.class).to(Key.get(B.class, Names.named("c1")));
    // Now expose the annotated bindings you'd like to expose.
    bind(C.class).annotatedWith(Names.named("c1")).to(C.class);
    expose(C.class).annotatedWith(Names.named("c1"));
  }
});

我认为没有办法说“对于所有注释 N,都可以@N B使用@N A,因为 Guice 被构建为从 (Annotation, TypeLiteral) 元组到提供者的精美映射,并且您要求推断可能的元组或者可能在依​​赖关系图中不存在。

于 2012-12-26T21:21:06.573 回答
0

这个怎么样:

bind(B.class).annotatedWith(Names.named("name")).toProvider( new Provider<B>() {

    private A namedA;

    @Inject
    public void setNamedA(@Named("name") A namedA ) {
        this.namedA = namedA;
    }      

    @Override
    public B get() {
        return new B( namedA );
    }

} );

它应该根据文档工作,虽然我没有测试过。

于 2012-12-26T10:43:42.277 回答