Supponiamo che io sono una terza classe parti come segue:Come posso fornire assistenza a una dipendenza non assistita?
public class MyObject {
@Inject
public MyObject(Foo foo, Bar bar) { ... }
}
Supponiamo ora che ho un'interfaccia di fabbrica in questo modo:
public interface MyObjectFactory {
public MyObject build(Bar bar);
}
L'idea è che vorrei avere un MyObjectFactory
che costruisce un MyObject
per un valore fisso Foo
- ovvero, aggiungendo essenzialmente l'annotazione @Assisted
sul parametro del costruttore Bar
dall'esterno. Naturalmente, l'implementazione manualmente MyObjectFactory
è sempre possibile:
public class MyObjectFactoryImpl implements MyObjectFactory {
@Inject private Provider<Foo> foo;
@Override
public MyObject build(Bar bar) { return new MyObject(foo.get(), bar); }
}
ma diciamo che ci sono le condizioni che mi richiedono di avere Guice costruire MyObject
casi - per esempio, il metodo intercettori. Questo mi sembra un lavoro per "iniettare l'iniettore":
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);
}
}
Questo suona male e caldaia-piatto-y, quindi mi chiedo se ci sono implementazioni alternative e/o un modo per avere Guice generare il fabbrica impl.
Anche in questo caso, poiché 'MyObject' è di terze parti, non è possibile modificare' MyObject'; altrimenti sarei in grado di usare semplicemente una vecchia iniezione assistita. –
Avvolgilo in un altro oggetto. –