Yeah, I should re-read mails before I press the submit button ;) Though, I'm trying to do (minimal part of) http://code.google.com/p/google-guice/issues/detail?id=62 . I guess that my only way is to use a method interceptor, catch the execution of the creationPartControl() method (which I annotate with @PostConstruct just to keep it general) and then run post-construction code (wiring presenter to model and view to model thru databinding) after the method has been executed.
Cheers Mario On 14 Dic, 06:20, dg <[email protected]> wrote: > I confess I don't follow the problem you're trying to solve here, but > to directly answer "how do I post-process an object constructed by > Guice", try com.google.inject.spi.InjectionListener > > -d > > On Dec 13, 8:30 am, Mario Scalas <[email protected]> wrote: > > > Hi all, > > in my eclipse-based application i've modelled model-view-presenter > > as different classes leaving the wiring (View to Presenter and > > Presenter-to-Model, and data-binding between model and view) to guice. > > Now I've used Peaberry Eclipse extension in order to let guice create > > and inject the View object and then pass it to the Eclipse framework. > > > Though, I also need that after Eclipse class the createPartControl() > > method on the view, databinding code is run to wire the view to the > > model (using Eclipse Databinding API). That is, I need post-processing > > the object when such method is called. > > I've resorted to write an interceptor to do this: > > > // In my module: > > public class LoginMVPConfig extends AbstractModule { > > @Override protected void configure() { > > bindModel( ILoginPresentationModel.class ) > > .toView( ILoginView.class ) > > .build(); > > } > > > protected <T> DataBinder<T> bindModel( Class<T> modelType ) { > > return new DataBinder<T>( binder(), modelType ); > > } > > > } > > > // Databinding DSL and glue-code > > public class DataBinder<T> { > > private final Class<T> modelType; > > private final Binder binder; > > private List<Class<?>> viewTypes; > > > public DataBinder( Binder binder, Class<T> modelType ) { > > this.binder = binder; > > this.modelType = modelType; > > this.viewTypes = new ArrayList<Class<?>>(); > > } > > > public DataBinder<T> toView( Class<?> viewType ) { > > viewTypes.add( viewType ); > > return this; > > } > > > /** > > * For each pair (model, view[i]) a method interceptor is created in > > order to perform databinding when > > * a method annotated with {...@link PostConstruct} annotation is > > executed. > > */ > > public void build() { > > for (Class<?> viewType : viewTypes) { > > DataBindingPostProcessor dataBinder = new > > DataBindingPostProcessor( > > binder.getProvider( modelType ) ); > > binder.bindInterceptor( only( viewType ), > > annotatedWith > > ( PostConstruct.class ), dataBinder ); > > binder.requestInjection( dataBinder ); > > } > > } > > > public class DataBindingPostProcessor implements MethodInterceptor { > > private final Provider<?> modelProvider; > > > @Inject > > private IDataBindingService dataBindingService; > > > public DataBindingPostProcessor( Provider<?> modelProvider ) { > > super(); > > this.modelProvider = modelProvider; > > } > > @Override public Object invoke( MethodInvocation methodInvocation ) > > throws Throwable { > > Object result = methodInvocation.proceed(); > > Object theView = methodInvocation.getThis(); > > dataBindingService.bind( theView, modelProvider.get() ); > > return result; > > } > > > } > > > That is I'm creating an interceptor for each (view,model) pair: which > > means that I'm going to have a lot of interceptors in my application! > > Is there any alternative approach for solving my problem? > > > Hope I've been clear enough, > > Mario -- You received this message because you are subscribed to the Google Groups "google-guice" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/google-guice?hl=en.
