У меня есть существующая иерархия объектов, где у некоторых объектов есть поля, которые необходимо ввести. Также есть некоторые другие объекты, которые создаются с помощью Google Guice и должны быть добавлены ссылки на некоторые объекты из ранее описанной иерархии объектов. Как мне сделать такую инъекцию с помощью Guice?
Проблема в том, что объекты из существующей иерархии не были построены с использованием Guice и поэтому не подлежат процессу инжекции по умолчанию. Существует, конечно, метод injector.injectMembers()
, способный вставлять в существующий экземпляр объекта, но он не работает с иерархиями объектов.
Для тех, кто задается вопросом, почему я не могу построить упомянутую иерархию объектов с помощью Guice. Эта иерархия представляет объекты GUI и построена с помощью GUI-инфраструктуры (Apache Pivot) из описания декларативного GUI (на самом деле этот процесс можно охарактеризовать как объект десериализации). В этом случае конструкция интерфейса довольно проста, и я хочу только добавить определенные ссылки на службы в объекты интерфейса и наоборот (для обратных вызовов).
Подход, который я сейчас собираюсь сделать, описан ниже.
Для ввода в ранее существовавшую иерархию объектов просто пусть все объекты, интересующиеся инъекцией, реализуют определенный интерфейс, например:
public interface Injectable {
void injectAll(Injector injector);
}
Эти объекты затем реализуют этот интерфейс следующим образом:
public void injectAll(Injector injector) {
injector.injectMembers(this);
for (Injectable child : children)
child.injectAll(injector);
}
Затем я просто вызываю mainWindow.injectAll(injector)
для корневого объекта в иерархии, и все объекты, представляющие интерес, вводятся.
Не очень приятное решение, но выполняет работу с одной стороны. С другой стороны, мне нужно вводить объекты из этой иерархии. Я предполагаю, что это можно сделать через реализацию настраиваемого поставщика для таких объектов.
Есть ли лучшее решение моей проблемы? Может быть, что-то не так с моим подходом?