Ciò che ha funzionato meglio per noi è stato l'utilizzo di Assisted Inject.
A seconda del caso, abbiamo definito le fabbriche di attività nell'attività stessa, in un pacchetto (per la creazione di tutte le attività in quel pacchetto) o in ActivityMapper.
public class MyActivity extends AbstractActivity {
private final MyView view;
@Inject
MyActivity(MyView view, @Assisted MyPlace place) {
this.view = view;
...
}
...
}
public class MyActivityMapper implements ActivityMapper {
public interface Factory {
MyActivity my(MyPlace place);
FooActivity foo(FooPlace place);
...
}
// using field injection here, feel free to replace by constructor injection
@Inject
private Factory factory;
@Overrides
public Activity getActivity(Place place) {
if (place instance MyPlace) {
return factory.my((MyPlace) place);
} else if (place instance FooPlace) {
return factory.foo((FooPlace) place);
}
...
}
}
// in the GinModule:
install(new GinFactoryModuleBuilder().build(MyActivityMapper.Factory.class));
BTW, per il metodo di iniezione per lavorare, si deve ancora creare le vostre attività tramite GIN, in modo da dovreste avere gli stessi problemi con l'iniezione del costruttore. Non c'è magia, GIN non magicamente inietterà classi di cui non sa nulla e nemmeno sa quando sono state istanziate. È possibile attivare il metodo di iniezione in modo esplicito con l'aggiunta di metodi per la vostra Ginjector, ma io non lo consiglio (il codice dipenderebbe dal Ginjector, che è qualcosa che si dovrebbe evitare, se possibile):
interface MyGinjector extends Ginjector {
// This will construct a Foo instance and inject its constructors, fields and methods
Foo foo();
// This will inject methods and (non-final) fields of an existing Bar instance
void whatever(Bar bar);
}
...
Bar bar = new Bar("some", "arguments");
myGinjector.whatever(bar);
...
Un'ultima parola: non passerei l'oggetto posto direttamente all'attività. Cerca di disaccoppiare luoghi e attività, che ti consentano di muoverti (ad esempio, costruisci una versione mobile o tablet, in cui passi tra viste master e dettagli, invece di visualizzarle fianco a fianco) semplicemente cambiando il layout della "shell" e mappatori di attività. Per disaccoppiarli davvero, devi creare una specie di navigatore , per esempio,, che astragga le tue chiamate placeController.goTo()
, in modo che le tue attività non abbiano mai a che fare con i luoghi.
fonte
2012-03-29 12:45:25
Ciao Thomas, Questo è esattamente ciò che facciamo nella nostra app (usando la fabbrica) e funziona bene. Tuttavia, come suggeriresti di integrarlo con AsyncProvider di GIN per la suddivisione del codice? (stiamo usando ActivityAsyncProxy http://ars-codia.raphaelbauer.com/2011/04/gwt-gin-and-simple-split-points.html) –