Portillo inyección de dependencias
-
05-09-2019 - |
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? :)
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)