2011-10-18 50 views
4

我有一个接口,A和B类实现A.吉斯辅助注射用单范围

然而,B的构造函数的样子:

 public class B (C c){} 

其中C是THRID党库类,只能在引导后创建。 ,我想B是一个单身人士。

我发现很难在Guice中实现它。我知道我可以使用辅助喷射器来做到这一点:

public class B (@Assisted C c){} 

    public AFactory { 
      public A createA(C c); 
    } 

但它看起来辅助注射器canot产生一个单例实例。

任何想法如何实现?

谢谢。

回答

1

在您的Module中,您可以创建一个C的实例并将其添加到上下文中。然后,您可以正常注释类B

@Singleton 
public class B... 
+0

感谢您的回答。但正如我所说的,在引导之前创建C是不可能的。它仅在应用程序运行时即时创建,尽管C也是一个Singleton。 – Wudong

+0

我想这取决于你的意思是自举。通过Guice,您可以在模块配置时以编程方式进行控制。因此,您可以通过编程等待,直到bootstapping完成,然后配置处理B&C类的模块。 –

+0

为什么不在没有帮助的情况下以旧式编码AFactory?用Guice注入工厂,但手工实现createA。 – ollins

1

我不认为你需要在这里辅助注射。

您是否考虑实施(并绑定)Provider<C>?然后C变为可注射到B(以及任何需要C的地方)。

5

正如你发现的那样,你不能使用辅助注入来创建单例。辅助注入是需要编程参数的实例,而单例不是以编程方式创建的。

单身人士是懒惰地构建的,除非你调用在模块中的绑定。所以你可以简单地将C注入到B中,并且在创建Guice注入器后创建C的实例。如果更多地涉及到C的创建,请创建C的提供者并将其绑定到您的模块中。