1

Я попытался понять инъекцию зависимостей и не получил ее, за исключением того, что мне удалось понять, что это затрудняет понимание чужого кода. : '(Стратегии для проекта обратного проектирования, который использует Guice?

В любом случае, я не уверен, как кратко описать мою проблему, но я попробую. В настоящее время я являюсь единственным кодером, работающим над проектом Java, над которым работали десятки одиночек в течение примерно шести лет. активно использует библиотеку Guice Google. Я должен взять какой-то существующий код и реализовать его по-разному, в частности, использовать существующие методы аутентификации пароля и вместо того, чтобы применять его к каждому JMenuItem в JMenu, примените его ко всему JMenu , так что, если введен неправильный пароль или пароль, все JMenuItems отключены. Этого не происходит, если пароль неверен, что приводит к тому, что проблема заключается в инструкции if, которая представляет собой длинную строку зависимостей сама по себе :
if (!ViewScanApp.getApplication().getHistoryManager().isAuthenticated())

Я прослежу путь назад, чтобы найти, что класс HistoryManager - это интерфейс, и там мой путь, кажется, умирает; там нет кода, и он не делает ссылку на какой-либо другой класс. Я нашел конец пути путем случайного исследования 100-нечетных классов в проекте, но я не могу их связать. Я не могу найти, где первый класс, который я могу найти на другом конце этого стека, вызывается AccessManagerImpl.

Я мог бы использовать объяснение инъекции зависимостей, которые могут быть применимы к этой ситуации. Спасибо огромное!

+0

«Инъекция зависимостей» - это как «новый», за исключением случаев, когда магия используется вместо того, чтобы вводить «новый» ... –

ответ

3

Предполагая, что нет @ImplementedBy аннотацию на интерфейсе HistoryManager, вам необходимо изучить Guice Module, который отвечает за связывая этот тип.

В Eclipse есть команда поиска входов класса. Готов поспорить, что у Netbeans есть что-то подобное. Используйте его, чтобы искать вхождения HistoryManager. По крайней мере, один из них должен иметь место в классе, который реализует com.google.inject.Module (или расширяет AbstractModule). Скорее всего, вы увидите что-то вроде

protected void configure() { 
    … 
    bind(HistoryManager.class).to(HistoryManagerImpl.class); 
    … 
} 

Или, если вы хотите быстрое и грязный эмпиризм, вы можете бросить в println():

HistoryManager mgr = ViewScanApp.getApplication().getHistoryManager(); 
System.out.println("HistoryManager implementation: " + mgr.getClass()); 
if (!mgr.isAuthenticated()) 
    … 

Однако вы найти его, HistoryManagerImpl класса, где вы «Я хочу забрать след.

Я не использовал его, но Guice graphing tool также может быть полезен.

+0

Проблема была решена с помощью deus ex machina: оригинального программиста. Тестирование, которое вы мне дали, дало $ proxy7, чего я не понимаю.Затем он указал мне в сторону правильного класса, который диктует привязки, которые я не мог видеть в другом месте. – malenkylizards

1

Запустите отладчик. Он будет ходить вас через точный класс, который реализует этот интерфейс (если у вас есть исходный код к нему)

1

Если у вас есть определение интерфейса в Eclipse, которое вводится с помощью Guice, вместо использования F3, чтобы перейти к определению, которое вы сделали бы, если бы это был класс, а затем используйте Ctrl-T, чтобы выбрать среди реализаций этого интерфейса ,

Если у вас есть несколько вариантов выбора, вам необходимо распечатать привязки модулей, чтобы вы знали, какой из них выбрать. К сожалению, Eclipse пока не понимает инъекцию.

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