Мне нравится думать о фабриках двумя способами: фабрики, которые просто собирают объекты из компонентов, и фабрики, которые делают условную логику в этой сборке.
За вашими фабриками стоит логика.Guice не может автоматизировать эту логику, потому что он просто обрабатывает зависимости.Если у вас есть созданный тип, которому требуется некоторое количество внедренных зависимостей и некоторые вещи, которые предоставляются только во время создания, тогда автоматическое подключение фабрик может быть выполнено с расширением AssistedInject guice .Это позволит вам предоставить интерфейс фабрики, аннотировать любые поля в созданном типе с помощью @AssistedInject, а расширение guice создаст класс реализации фабрики, который будет внедрять все, что связано в Injector, а также проходить через эти параметры create ().Но в таком случае все, что делают Guice и AssistedInject - это собирать кусочки вместе - связывать вещи по заранее заданному рецепту.Он не принимает решения о них в последнюю минуту.
Вы предоставляете условное создание объектов.Это не сработает.
Идея выше упоминает создание фабрики, которая зависит от отображения типа на презентатор - что-то вроде:
Map<Class<? extends Message>, Class<? extends MessagePresenter>>
Это хороший подход, если вы объедините егос MultiBinder MapBindings .(Я должен расширить эти документы ... хм)
При таком подходе вы можете создать расширяемую фабрику - определяющую начальные отображения подклассов Message -> MessagePresenter, но оставьте возможность открытой для дополнительных сопоставлений позже, не имеячтобы изменить свою фабрику - просто привяжите больше сопоставлений к мультибиндеру, например так:
MapBinder<String, Snack> mapbinder = MapBinder.newMapBinder(
binder(),
new TypeLiteral<Class<? extends Message>>(){},
new TypeLiteral<Class<? extends MessagePresenter>>(){});
mapbinder.addBinding(MyMessage.class).toInstance(MyMessagePresenter.class);
mapbinder.addBinding(YourMessage.class).toInstance(YourMessagePresenter.class);
И вы можете делать это в любом количестве модулей, добавляя больше типов для переключения между ними, используя сопоставление.