Pregunta

Tengo una página con un formulario en donde la forma Wicket requiere un colaborador para conseguir su trabajo hecho. se inyecta el colaborador (por la que estoy usando Guice) y se ve algo como:

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();
        }
    }
}

No me gusta la idea de que la RegistrationService se inyecta en el RegistrationPage cuando es sólo la RegistrationForm que lo necesita. Podría cambiar el RegistrationForm para recibir el RegistrationService:

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

y eliminar el campo de la RegistrationPage, pero el RegistrationPage todavía se utiliza para hacer el paso a través.

Creo que lo que estoy pidiendo es lo que la mejor práctica es para hacer esto? ¿Está bien que hacer, o quizá sería mejor para inyectar el RegistrationForm sí mismo en la página:

   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();
        }
    }

Yo prefiero esto como me gustaría tener la RegistrationForm en una clase / archivo separado. Soy bastante nuevo en portillo tan insegura de lo que es la norma - alguien me puede mostrar la luz que guía? :)

¿Fue útil?

Solución

el paradigma básico con wicket + COI es: la mayoría de las dependencias deben inyectarse a través de inyección setter. la inyección de constructor es imposible para páginas web.

componentes / paneles / formas / páginas sólo deben estar en el extremo recieving.

así, inyectar la dependencia a RegistrationService feliz en la RegistrationForm, a continuación, crear en el RegistrationPage con add (nuevo RegistrationForm ());

portillo tiene IComponentInstantiationListener - uno de ellos es guice. que recibir una notificación durante el constructor de cada componente / página web. por lo que su RegistrationForm tendrá sus dependencias se inyecta antes de que cualquier parte de su código se puede ejecutar.

la forma en que lo haría: (Por supuesto RegistrationForm puede estar en otro archivo)

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();
    }
}
}

Si usted decide poner el RegistrationForm dentro de la página como clase interna, recuerde que debe declararlo estática! lo más probable es que no se necesita ninguna referencia a la clase envolvente.

Otros consejos

En mi opinión DI en Wicket tiene un elemento confuso, se hace automagicamente en los Componentes o Páginas pero no en modelos. En mi opinión exactamente Modelo (pero no la página) debe tener la dependencia de la APP, etc.

doc Oficial decir utilizar InjectorHolder.getInjector().inject(this)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top