多くの場合、クラスをインスタンス化 (構築) してから、使用する前に「配線」 (構成) する必要があります。例えば:
// 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のベテランはどこに配線/設定コードを置きますか?