Лучшим для нас было использование Assisted Inject.
В зависимости от случая мы определяли фабрики операций либо в самой операции, в пакете (для создания всех операций в этом пакете), либов 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));
Кстати, чтобы внедрение метода работало, вы все равно должны создавать свои действия через GIN, поэтому у вас будут те же проблемы, что и при внедрении конструктора.Там нет магии, GIN не будет магически вводить классы, о которых он не знает и даже не знает, когда они были созданы.Вы можете явно инициировать внедрение метода, добавляя методы в свой Ginjector, но я бы не советовал его (ваш код будет зависеть от Ginjector, чего вы должны избегать, если можете):
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);
...
AПоследнее слово: я бы не передал объект place непосредственно в действие.Попробуйте разделить места и действия, которые позволяют вам перемещать вещи (например, создать мобильную или планшетную версию, где вы переключаетесь между основным и подробным видами, вместо того, чтобы отображать их рядом), просто изменив макет «оболочки» икартографы деятельности.Чтобы по-настоящему отделить их, вы должны создать своего рода навигатор , который будет абстрагировать ваши placeController.goTo()
звонки, чтобы ваша деятельность никогда не имела отношения к местам.