Мне нравится думать о заводах в двух направлениях - заводы, которые просто собирают предметы из компонентов, а также заводы, которые делают условную логику в этой сборке.
У ваших заводов есть логика позади них. Guice не может автоматизировать эту логику, потому что она просто обрабатывает проводки зависимостей. Если у вас есть тип, который создается, который требует некоторого количества вложенных зависимостей и некоторых вещей, которые предоставляются только во время создания, то автоматическая проводка заводов может быть выполнена с помощью AssistedInject extension. Это позволит вам предоставить интерфейс фабрики, аннотировать любые поля в созданном типе с помощью @AssistedInject, а расширение guice будет создавать класс фабричной реализации, который будет вводить все, что связано с Injector, а также передавать эти параметры create(). Но в этом случае все, что делают Guice и AssistedInject, - это вытаскивание кусочков - проводка вещей в соответствии с указанным заранее рецептом. Он не принимает решения о них в последнюю минуту.
Вы предоставляете условное создание объектов. Это не сработает.
An idea above упоминает что делает завод, который зависит от типа отображения на ведущий - что-то вроде:
Map<Class<? extends Message>, Class<? extends MessagePresenter>>
Это хороший подход, если сочетать его с Multibinder-х MapBindings. (Я должен усилить эти документы ... hmm)
С помощью этого подхода вы можете создать расширяемую фабрику, определяющую начальные сопоставления подклассов Message -> MessagePresenter, но оставлять возможность открытой для дополнительных сопоставлений позже без изменения ваш завод - просто связать несколько сопоставлений на multibinder, например, так:
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);
И вы можете сделать это, как многие модули, как вам нравится, добавив несколько типов, между которыми переключаться, используя отображение.
Вы спрашиваете, может ли Guice разработать логику, необходимую для превращения сообщения в презентацию сообщения? Тогда нет. –
Я спрашиваю, могу ли я настроить модуль guice, который будет отображать Letter-> LetterPresenter и т. Д., И guice создаст для меня фабрику. – oshai