2012-03-29 3 views
1

У меня есть следующий класс фабрики:можно ли создать фабрику для меня?

public class MessagePresenterCreator implements IPresenterFactory{ 
    @Override 
    public MessagePresenter createPresenter(Message m) { 
     if (m instanceof Letter) { 
      return new LetterPresenter(); 
     } 
     if (m instanceof Cable) { 
      return new CablePresenter(); 
     } 
     if (m instanceof Postcard) { 
      return new PostcardPresenter(); 
     } 
     throw new IllegalArgumentException(); 
    } 
} 

Могу ли я сконфигурировать Guice для автоматического создания и поставить такой завод по следующему интерфейсу:

public interface IPresenterFactory { 
    public abstract MessagePresenter createPresenter(Message m); 
} 
+0

Вы спрашиваете, может ли Guice разработать логику, необходимую для превращения сообщения в презентацию сообщения? Тогда нет. –

+0

Я спрашиваю, могу ли я настроить модуль guice, который будет отображать Letter-> LetterPresenter и т. Д., И guice создаст для меня фабрику. – oshai

ответ

1

Нет Guice не не имеет завод подобного вы можете написать завод, который взял Map<Class<? extends Message>, Class<? extends MessagePresenter> и использовал это отражение. Таким образом, вы можете управлять им в модуле guice, если это ваша цель.

public class MessagePresenterCreator implements IPresenterFactory{ 
    private final Map<Class<? extends Message>, Class<? extends MessagePresenter> mapping; 
    public MessagePresenterCreator(Map<Class<? extends Message>, Class<? extends MessagePresenter> mapping) { 
     this.mapping = mapping; 
    } 

    @Override 
    public MessagePresenter createPresenter(Message m) { 
     Class<? extends MessagePresenter> clazz = mapping.get(m); 
     if (clazz == null) { 
      throw new UnsupportedOperationException(); 
     } 
     return clazz.newInstance(); 
    } 
} 
4

Мне нравится думать о заводах в двух направлениях - заводы, которые просто собирают предметы из компонентов, а также заводы, которые делают условную логику в этой сборке.

У ваших заводов есть логика позади них. 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); 

И вы можете сделать это, как многие модули, как вам нравится, добавив несколько типов, между которыми переключаться, используя отображение.

+0

hmmm, я пытаюсь сделать это с привязкой к карте > и вообще не работает http://stackoverflow.com/questions/14833777/guice-multibinder-with-providers Мне нравится эта функция, но похоже, не может заставить его работать. –

Смежные вопросы