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