Gin & GWT: Capa de presentación de encuadernación con vistas
Pregunta
Estoy tratando de obligar a fin de GWT con su capa de presentación, pero no parece estar haciendo nada.
Es un proyecto generado Spring Roo GWT y estoy tratando de utilizar el andamio dada la medida de lo posible. La vista es un simple botón (R.ui.xml) y el resto de la vista se define en R.java:
public class R extends Composite implements RPresenter.Display {
interface MyUiBinder extends UiBinder<Widget, R> {}
private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);
@UiField Button myButton;
private ClickHandler buttonClickHandler = null;
public R(){
initWidget(uiBinder.createAndBindUi(this));
}
@UiHandler("myButton")
void onButtonClick(ClickEvent event){
GWT.log('Button clicked');
if (buttonClickHandler != null){
GWT.log("buttonClickHandler event triggered");
buttonClickHandler.onClick(event);
}
}
@Override
public void setButtonClickHandler(ClickHandler buttonClickHandler) {
GWT.log("setButtonClickHandler");
this.buttonClickHandler = buttonClickHandler;
}
}
El presentador:
public class RPresenter {
public interface Display extends IsWidget {
void setButtonClickHandler(ClickHandler buttonClickHandler);
}
private final Display display;
private final EventBus eventBus;
@Inject
public RPresenter(EventBus eventBus, Display display){
this.display = display;
this.eventBus = eventBus;
bind();
}
private void bind(){
display.setButtonClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
GWT.log("onClick event triggered");
}
});
}
public void go(HasWidgets container){
container.add(display.asWidget());
}
}
Y para mi módulo de GIN utilizo el ScaffoldModule generado en el paquete ... client.scaffold.ioc:
public class ScaffoldModule extends AbstractGinModule {
@Override
protected void configure() {
GWT.log("ScaffoldModule configure");
bind(EventBus.class).to(SimpleEventBus.class).in(Singleton.class);
bind(ApplicationRequestFactory.class).toProvider(RequestFactoryProvider.class).in(Singleton.class);
bind(PlaceController.class).toProvider(PlaceControllerProvider.class).in(Singleton.class);
//bind(RPresenter.Display.class).to(R.class).in(Singleton.class);
bind(RPresenter.Display.class).to(R.class);
}
static class PlaceControllerProvider implements Provider<PlaceController> {
private final EventBus eventBus;
@Inject
public PlaceControllerProvider(EventBus eventBus) {
this.eventBus = eventBus;
}
public PlaceController get() {
return new PlaceController(eventBus);
}
}
static class RequestFactoryProvider implements Provider<ApplicationRequestFactory> {
private final EventBus eventBus;
@Inject
public RequestFactoryProvider(EventBus eventBus) {
this.eventBus = eventBus;
}
public ApplicationRequestFactory get() {
ApplicationRequestFactory requestFactory = GWT.create(ApplicationRequestFactory.class);
requestFactory.initialize(eventBus);
return requestFactory;
}
}
}
En la consola de modo de desarrollo GWT, el "configure ScaffoldModule" nunca aparece, sin embargo, el andamio generada parece vinculante bien como los acontecimientos van pasando a lo largo de componente a componente sin ningún problema, a menos que la unión es mágicamente sucediendo en otra parte y es decir código muerto.
Cuando pongo mi bind (RPresenter.Display.class) .para (R.class) en, no parece que hacer la unión. La única salida que me meto en la consola de GWT es "botón de clic" que se llama en la vista y luego nada más. Me falta claramente algo, alguna idea?
Solución
La llamada a GWT.log () cualquier cosa que no es la salida de un AbstractGinModule - clases que se extienden AbstractGinModule (ScaffoldModule en su situación) son utilizados por la ginebra al compilar para decidir qué implementaciones concretas a utilizar para las interfaces inyectados. Del resto de su descripción (es decir, que los programas de la interfaz de usuario hasta en la aplicación) Parece que la inyección de dependencia está trabajando correctamente.