2009-10-20 1 views
1

Вот проблема, которую я встретил:Как связать класс Assisted Injected с интерфейсом?

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 с исполняемым, когда SimpleCommand имеет параметр Assisted Injected?

Вот 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); 
    } 
} 
+0

Что такое команда? Должна ли фабрика возвращать исполняемый файл или SimpleCommand? – ColinD

+1

Кроме того, почему у вас есть реализация CommandFactory? Идея заключается в том, что Assisted Inject создает реализацию для вас. – ColinD

ответ

0

Там, кажется, две проблемы.

Первый - bind(Executable.class).to(SimpleCommand.class). Связывание Executable с SimpleCommand подразумевает, что SimpleCommand можно вводить непосредственно в классы с зависимостью от Executable. Но так как Guice не может создать экземпляр SimpleCommand (ему нужен вспомогательный параметр, предоставленный на заводе), привязка недействительна. Сообщение об ошибке обрабатывает @Assisted как стандартную аннотацию привязки и пытается разрешить связанный с ним объект в конструкторе String, но ни один из них не связан.

Кроме того, кажется, что если вы используете Assisted INJECT создать фабрику для Executable с, вы не можете создать другую привязку к нему без использования какой-связывающей аннотации на нем. Поскольку вы используете вспомогательную инъекцию, предположительно, вы хотите создать несколько экземпляров Executable, используя ваш завод, поэтому любой человек Executable, который вы хотели связать напрямую, вероятно, имел бы определенное значение в вашей системе, верно?

В этом случае, вы должны просто использовать некоторые привязки аннотацию, как @Default и метод провайдера, как так:

@Provides 
@Default 
protected Executable provideDefaultExecutable(ConfigManager configManager) { 
    return new SimpleCommand(configManager, "My default command"); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^