1

这是我遇到的问题:

Class SimpleCommand implements Executable{
private final ConfigManager config;
private String name;

@Inject    
public SimpleCommand(ConfigManager config, @Assisted String name){
  this.config = config;
  this.name = name;
  }
}

Class MyModule extends AbstractModule{
@Override
protected void configure() {
     bind(CommandFactory.class).toProvider(FactoryProvider.newFactory(CommandFactory.class, SimpleCommand.class));
     bind(Executable.class).to(SimpleCommand.class);
     }
}

当我尝试使用以下方法获取 SimpleCommand 实例时:

Guice.createInjector(new MyModule()).getInstance(CommandFactory.class).create("sample command");

我收到了这个错误:

1) No implementation for java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=) was bound.
  while locating java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=)
    for parameter 2 at model.Command.<init>(SimpleCommand.java:58)
  at module.MyModule.configure(MyModule.java:34)

所以我的问题是当 SimpleCommand 具有 Assisted Injected 参数时,如何将 SimpleCommand 绑定到 Executable?

这是 CommandFactory 及其实现:

public interface CommandFactory{
  public Command create(String name);
}


public class GuiceCommandFactory implements CommandFactory{
  private Provider<ConfigManager> configManager ;

  @Inject
  public GuiceCommandFactory(Provider<ConfigManager> configManager){
    this.configManager = configManager;
  }

  public Command create(String cmd){
    return new Command(configManager.get(), cmd);
  }
}
4

1 回答 1

0

似乎有两个问题。

一是与bind(Executable.class).to(SimpleCommand.class)。绑定ExecutableSimpleCommand意味着SimpleCommand可以将 a 直接注入到依赖于 的类中Executable。但是由于 Guice 不能创建SimpleCommand自己的实例(它需要提供给工厂的辅助参数),所以绑定是无效的。错误消息被@Assisted视为普通绑定注释,并尝试String在构造函数中解析对其的绑定,但没有绑定。

除此之外,似乎如果您使用 Assisted Inject 为 s 创建工厂,则如果不对其使用一些绑定注释,则Executable无法创建另一个绑定。由于您使用的是辅助注入,大概您想创建多个使用工厂的实例,因此您想要直接绑定的任何个人都可能在您的系统中具有某些特定含义,对吧?ExecutableExecutable

在这种情况下,您应该只使用一些绑定注释@Default和提供者方法,如下所示:

@Provides
@Default
protected Executable provideDefaultExecutable(ConfigManager configManager) {
   return new SimpleCommand(configManager, "My default command");
}
于 2009-10-22T20:18:03.317 回答