0

在 Guice,我有一个类“面板”和一个类“控制器”。两者是相互关联的。控制器有 3 个子类(比如 A、B 和 C)。我想为程序员提供一种简单的方法来获取 Panel 实例,其中注入了 3 个控制器之一,具体取决于他们的需要。

例如,在特定的代码点,程序员可能希望获得一个注入了 ControllerA 的 Panel 实例,但在不同的地方,他可能需要带有 ControllerB 的 Panel。

我怎样才能做到这一点?

4

2 回答 2

1

您可以使用绑定注释让用户指定他们想要的: http ://code.google.com/p/google-guice/wiki/BindingAnnotations

您将像这样创建注释:

import com.google.inject.BindingAnnotation;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;

@BindingAnnotation @Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
public @interface WithClassA{}
@BindingAnnotation @Target({ FIELD, PARAMETER, METHOD }) @Retention(RUNTIME)
public @interface WithClassB{}
...

然后你的用户的构造函数看起来像

@Inject
public MyConstructor(@WithClassA Panel thePanel) {...}

然后,当您进行绑定时,您将使用 .annotatedWith:

bind(Panel.class)
    .annotatedWith(WithClassA.class)
    .toProvider(ProviderThatReturnsPanelConstructedWithA.class);
bind(Panel.class)
    .annotatedWith(WithClassB.class)
    .toProvider(ProviderThatReturnsPanelConstructedWithB.class);

以防万一,这里是关于如何设置提供者的文档:http ://code.google.com/p/google-guice/wiki/ProviderBindings

于 2012-08-28T15:58:56.623 回答
1

我想出了一个可能的解决方案:Guice 允许您绑定到提供程序实例,而不仅仅是一个类。因此,您可以只创建一个带有一个参数的构造函数的提供者,然后像这样绑定它:

bind(Panel.class).annotatedWith(WithClassA.class).toProvider(new MyProvider("a"))

构造函数的参数类型可以是任何其他类型,例如枚举甚至注释,传入相同的 WithClassA.class。

这是保存提供者的好方法。缺点是您的提供程序中不会有依赖注入,但在这种情况下,这是我可以忍受的。

于 2012-10-26T22:26:05.403 回答