Каков наилучший шаблон для управления несколькими версиями одного и того же дерева зависимостей в Guice?

Я хотел бы создать несколько версий одного и того же вида дерева / цепочки зависимостей, которые используют разные реализации для некоторых интерфейсов в этом дереве / цепочке. Какую практику / шаблон Guice лучше всего использовать в таком случае?

Вот конкретный пример моей проблемы.

У меня есть интерфейс Writer , который потенциально может быть средством записи файлов или стандартным -out писатель, который будет расположен на конце моей иерархии зависимостей. Примерно так:

interface Writer { ... }
class FileWriter implements Writer { ... }
class StdOutWriter implements Writer { ... }

Другой интерфейс регистратора используется для добавления уровня косвенного обращения к писателю. Например:

interface Logger { ... }

class LoggerImpl{
  @Inject
  public Logger(Writer out){ ... }
  public void log(String message){ out.println(message); }
}

Затем есть клиент, который использует регистратор.

class Client{
  @Inject
  public Client(Logger logger){ ... }
  public void do(){ logger.log("my message"); }
}

Теперь я хотел бы использовать в моей программе два типа иерархий:

  1. Клиент -> LoggerImpl -> FileWriter
  2. Клиент -> LoggerImpl -> StdOutWriter

Есть ли хороший способ подключить это без использования отдельного модуля Guice для 1 и 2?

В идеале я хотел бы иметь такой класс ClientFactory :

interface ClientFactory{
  public Client stdOutClient();
  public Client fileClient(); 
  //or fileClient(File outputFile) for extra points ;)
}

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

Я также хотел бы решение, которое масштабировалось бы для случаев, когда у меня есть большее разнообразие более длинных деревьев / цепочек зависимостей . Спасибо!

5
задан rodion 10 December 2010 в 17:11
поделиться