很多时候,类需要被实例化(构造),然后“连接”(配置)才能使用。例如:
// Construction.
EventBus bus = new EventBus();
FizzEventHandler fizzHandler = new FizzHandler();
BuzzEventHandler buzzHandler = new BuzzHandler();
// Wiring.
bus.register(fizzHandler);
bus.register(buzzHandler);
在 Guice 中,我们通过以下方式完成第一部分(构造;注入)Binder
:
public class MyModule extends AbstractModule {
@Override
public void configure() {
bind(EventBus.class).to(SimpleEventBus.class);
bind(FizzEventHandler.class).to(DefaultFizzEventHandler.class);
bind(BuzzEventHandler.class).to(DefaultBuzzEventHandler.class);
}
}
但是布线发生在哪里?当我的基于 Guice 的应用程序启动时,我们使用 DI“引导”过程:
public class MyApp {
private EventBus bus;
private FizzEventHandler fizzHandler;
// ...etc.
public static void main(String[] args) {
MyApp app = new MyApp();
app.run();
}
public MyApp() {
// Bootstrap DI.
MyModule myModule = new MyModule();
Injector injector = Guice.createInjector(myModule);
bus = injector.inject(EventBus.class);
fizzHandler = injector.inject(FizzEventHandler.class);
// ...etc.
// Wire
bus.register(fizzHandler);
}
}
这适用于顶级(根)DI 类。但是随着我们进一步“向下”依赖树,并进入应用程序使用的所有其他对象,将连接逻辑放在这样的构造函数中是丑陋的并且(我相信)是一种不鼓励的做法。
所以我问:厌战的 Guice 退伍军人将他们的接线/配置代码放在哪里?