次のようなサードパーティ クラスがあるとします。
public class MyObject {
@Inject
public MyObject(Foo foo, Bar bar) { ... }
}
ここで、次のようなファクトリ インターフェイスがあるとします。
public interface MyObjectFactory {
public MyObject build(Bar bar);
}
アイデアは、固定のMyObjectFactory
を構築するが必要だということです。つまり、基本的にコンストラクターパラメーターの注釈を外部から追加します。もちろん、手動で実装することは常に可能です。MyObject
Foo
@Assisted
Bar
MyObjectFactory
public class MyObjectFactoryImpl implements MyObjectFactory {
@Inject private Provider<Foo> foo;
@Override
public MyObject build(Bar bar) { return new MyObject(foo.get(), bar); }
}
しかし、Guice でインスタンスをビルドする必要がある条件があるとしましょうMyObject
(メソッド インターセプターなど)。これは「インジェクターを注入する」ための仕事のようです:
public class MyObjectFactoryImpl implements MyObjectFactory {
@Inject private Injector injector;
@Override
public MyObject build(Bar bar) {
Injector child = injector.createChildInjector(new AbstractModule() {
@Override
protected void configure() {
bind(Bar.class).toInstance(bar);
// Set up method interceptors for MyObject here...
}
});
return child.getInstance(MyObject.class);
}
}
これは邪悪でボイラープレートのように聞こえるので、代わりの実装や Guice にファクトリ impl を生成させる方法があるかどうか疑問に思っています。