Я хотел бы создать несколько версий одного и того же вида дерева / цепочки зависимостей, которые используют разные реализации для некоторых интерфейсов в этом дереве / цепочке. Какую практику / шаблон 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"); }
}
Теперь я хотел бы использовать в моей программе два типа иерархий:
Есть ли хороший способ подключить это без использования отдельного модуля Guice для 1 и 2?
В идеале я хотел бы иметь такой класс ClientFactory
:
interface ClientFactory{
public Client stdOutClient();
public Client fileClient();
//or fileClient(File outputFile) for extra points ;)
}
Может ли кто-нибудь придумать способ связать это с помощью этой фабрики или любым другим способом?
Я также хотел бы решение, которое масштабировалось бы для случаев, когда у меня есть большее разнообразие более длинных деревьев / цепочек зависимостей . Спасибо!