1

我正在使用 Guice 来管理我的班级依赖性。我有一个 LogicHandler 类,它依赖于几个 Components 类。

  public interface LogicHandler {
      private Component component1;
      private Component component2;
      private Component component3;
  }

  public interface Component {
      public String doWork();
  }

我将有 3 个 LoigcHanlder 实例。使用哪个实例将在运行时决定。每个实例都有不同的组件实现,所有实现都是预定义的。

如果我使用的是 spring DI,xml 配置将如下所示:

<bean id="handler1" class="org.sample.handlers.DefaultHanlder">
  <property name="component1" ref="componentImplementationA" />
  <property name="component2" ref="componentImplementationB" />
  <property name="component3" ref="componentImplementationC" />
</bean>

<bean id="handler2" class="org.sample.handlers.DefaultHanlder">
  <property name="component1" ref="componentImplementationD" />
  <property name="component2" ref="componentImplementationE" />
  <property name="component3" ref="componentImplementationF" />
</bean>

<bean id="handler3" class="org.sample.handlers.DefaultHanlder">
  <property name="component1" ref="componentImplementationG" />
  <property name="component2" ref="componentImplementationH" />
  <property name="component3" ref="componentImplementationI" />
</bean>

注意:所有处理程序都由 DefaultHanlder 实现。

使用哪个处理程序实例基于某些参数。

4

2 回答 2

0

使用限定符(例如 @Named("handler1"))并显式绑定您的实例。

 bind(Component.class).annotatedWith(Names.named("handler1").toInstance(...);
于 2015-02-16T05:50:50.547 回答
0

假设我正确理解了您的问题,您希望根据特定参数选择特定的具体实现进行绑定。一种方法是创建一个模块,该模块将决定绑定哪个模块所需的参数作为构造函数。绑定特定具体实现的逻辑将在bind模块的方法中。例如

public class YourModule extends AbstractModule {

Parameters settings;

public YourModule(Parameters settings) {
    this.settings = settings;
}

@Override
protected void configure() {
   if(settings.val == 1) {
      bind(DefaultHanlder.class).toInstance(ComponentA.class);
   } else if(settings.val == 2) {
      bind(DefaultHanlder.class).toInstance(ComponentB.class);
   }
   .
   .
   .
}

创建喷油器时,请使用YourModule模块,以便正确接线。然后注入器应该注入正确的具体类,因为DefaultHanlder您的客户端代码不知道如何选择正确的具体实现。

可能还有其他方法可以做到这一点(例如 AssistedInjection 也可能有效),但使用单独的模块非常简单。

于 2015-02-16T12:33:09.330 回答