Инъекция зависимости калитки - PullRequest
4 голосов
/ 18 февраля 2009

У меня есть страница с формой в Wicket, где для работы требуется форма соавтор. Соавтор вводится (для чего я использую Guice) и выглядит примерно так:

public class RegistrationPage extends WebPage {
    @Inject
    public RegistrationPage(RegistrationService service) {
        this.service = service;
        add(new RegistrationForm());            
    }

    private class RegistrationForm extends Form {
        public RegistrationForm() {
            // setup
        }

        protected void onSubmit() {
           service.doSomething();
        }
    }
}

Мне не нравится идея, что RegistrationService внедряется в RegistrationPage, когда это требуется только для RegistrationForm. Я мог бы изменить Регистрационную форму, чтобы получить Службу регистрации:

public RegistrationForm(RegistrationService service) {
    this.service = service;
}

и удалите поле из RegistrationPage, но RegistrationPage по-прежнему используется для сквозного доступа.

Полагаю, я спрашиваю, каков лучший метод для этого? Это нормально, или, возможно, было бы лучше добавить саму RegistrationForm на страницу:

   public class RegistrationPage extends WebPage {
        @Inject
        public RegistrationPage(RegistrationForm form) {
            add(form);
        }
   }

   ---

   private class RegistrationForm extends Form {
        private RegistrationService service;

        @Inject
        public RegistrationForm(RegistrationService service) {
            this.service = service;
        }

        protected void onSubmit() {
           service.doSomething();
        }
    }

Я бы предпочел это, так как мне бы хотелось, чтобы RegistrationForm находился в отдельном классе / файле. Я совершенно новичок в Wicket, поэтому не уверен, что это за норма - может кто-нибудь показать мне путеводный свет? :)

Ответы [ 2 ]

3 голосов
/ 20 марта 2009

базовая парадигма с калиткой + ioc: большинство зависимостей должно быть введено через установщик. внедрение в конструктор невозможно для веб-страниц.

компоненты / панели / формы / страницы должны быть только на приемном конце.

Итак, счастливо вставьте зависимость в RegistrationService в RegistrationForm, затем создайте ее в RegistrationPage с помощью add (new RegistrationForm ());

У калитки есть IComponentInstantiationListener - один из них хитрый. они получают уведомление во время конструктора каждого компонента / веб-страницы. так что вашей RegistrationForm будут внедрены зависимости, прежде чем любая часть вашего кода сможет выполняться.

так, как я бы это сделал: (конечно же RegistrationForm может быть в другом файле)

public class RegistrationPage extends WebPage {

@Inject
public RegistrationPage() {
    add(new RegistrationForm());            
}

---
private static class RegistrationForm extends Form {
   RegistrationService service;

      @Inject
     public void setRegistrationService (RegistrationService  service){
     this.service = service;
        }
    public RegistrationForm() {
        // setup
    }

    protected void onSubmit() {
       service.doSomething();
    }
}
}

если вы решили поместить RegistrationForm внутри страницы как внутренний класс, не забудьте объявить его статическим! вам, скорее всего, не понадобятся ссылки на включающий класс.

0 голосов
/ 03 сентября 2015

По моему мнению, DI на Wicket имеет один запутанный элемент, это делается автоматически на компонентах или страницах, но не в моделях. По моему мнению, именно модель (но не страница) должна зависеть от JPA и т. Д.

Официальный документ говорит использовать InjectorHolder.getInjector().inject(this)

...