我正在审查 Guice。假设我有以下设置:
public interface IsEmailer {...}
public interface IsSpellChecker {...}
public class Emailer implements IsEmailer {
@Inject
public class Emailer(final IsSpellChecker spellChecker)....
}
public class FrenchSpellChecker implements IsSpellChecker {....}
public class EnglishSpellChecker implements IsSpellChecker {....}
@BindingAnnotation public @interface English {}
@BindingAnnotation public @interface French {}
然后在我的模块中,我将接口绑定到它们各自的实现,并使用各自的绑定注释对拼写检查器进行注释。
现在,假设基于运行时变量,我需要构建一个使用英语或法语拼写检查器的电子邮件程序。
我想在我的模块中使用命名提供程序:
@Provides
@English
IsEmailer provideEnglishEmailer() {
return new Emailer(new EnglishSpellChecker());
}
@Provides
@French
IsEmailer provideFrenchEmailer() {
return new Emailer(new FrenchSpellChecker());
}
这像这样工作:
IsEmailer emailer = myModule.getInstance(Key.get(IsEmailer.class,
French.class));
这是做这种事情的最干净的方法吗?毕竟,我不得不手动(在提供程序中)构建对象。
谢谢