依赖注入-指南:构建对象/机器人腿的相关树



我有一个类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。我怎样才能正确地绑定它们?

下面是我使用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);
            }
        });
}

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

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

最后一个想法:为什么不把构造函数留给A作为公共的,这样库的用户就可以手动注入依赖?如果这只用于内部使用,那么记录该函数也足够了。

我认为你正在寻找的解决方案是私有模块

  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

相关内容

  • 没有找到相关文章

最新更新