Well the predictors are being handed to the dispatcher like this: @Inject public int registerPredictors( PredictorProfileList predictors ) { if( _predictors == null ) _predictors = predictors; else _predictors.addAll( predictors );
return predictors.size(); } Currently the Dispatcher has no non-default constructors. Can't I pass in a Provider like this: @Inject public Dispatcher( Provider<DispatchHandler> handlerProvider ) { _handlerProvider = handlerProvider; } and have the dispatch method call it a bit like this: public boolean dispatch() { for( PredictorProfile predictor : _predictors ) { DispatchHandler handler = _handlerProvider.get(); handler.handle( _predictor ); } return true; } ? Granted that would disguise the fact that DispatchHandlers are Threads but is that necessarily a bad thing? Or is there another reason to avoid doing it this way? Thanks for all the feedback -- much appreciated... Andrew. 2008/10/16 Bob Lee <[EMAIL PROTECTED]>: > Providers work when everything is injected, but in this case, you have a run > time argument. Mixing injected dependencies with run time arguments in a > statically typed-fashion requires you to roll your own factory/builder. > > You could just add a predictor setter to DispatchHandler and then just > inject a Provider<DispatchHandler> into Dispatcher, but I prefer things to > be immutable myself. > > Bob > > On Thu, Oct 16, 2008 at 9:24 AM, Andrew Clegg <[EMAIL PROTECTED]> > wrote: >> >> Okay... You took me by surprise a bit, I was expecting something based >> on Provider<DispatchHandler>. Like injecting a >> Provider<DispatchHandler> as one of the arguments to the Dispatcher >> constructor (or a setter). >> >> Have I got the wrong end of the stick? Is that not what Providers are >> meant for? >> >> Thanks, >> >> Andrew. >> >> 2008/10/16 Bob Lee <[EMAIL PROTECTED]>: >> > Oh, Jesse also has AssistedInject which can help with this stuff, but I >> > still like to kick it old school. He can tell you more. >> > >> > Bob >> > >> > On Thu, Oct 16, 2008 at 9:16 AM, Bob Lee <[EMAIL PROTECTED]> wrote: >> >> >> >> Assuming you need to inject stuff into DispatchHandler and you don't >> >> want >> >> Dispatcher to know about DispatchHandler's deps, here's how I would do >> >> it. >> >> >> >> public class Dispatcher { >> >> >> >> private final DispatchHandler.Factory handlerFactory; >> >> >> >> // package-private for unit testing >> >> @Inject Dispatcher(DispatchHandler.Factory handlerFactory) { >> >> this.handlerFactory = handlerFactory; >> >> } >> >> >> >> ... >> >> >> >> public boolean dispatch() { >> >> for(PredictorProfile predictor : predictors) { >> >> handlerFactory.newInstance(predictor).start(); >> >> } >> >> return true; >> >> } >> >> } >> >> >> >> public class DispatchHandler extends Thread { >> >> >> >> private DispatchHandler(PredictorProfile predictor, Dep1 d1, ...) { >> >> ... >> >> } >> >> >> >> ... >> >> >> >> public static class Factory { >> >> >> >> private final Dep1 d1; >> >> ... >> >> >> >> // package-private so we can unit test easily. >> >> @Inject Factory(Dep1 d1, ...) { ... } >> >> >> >> ... >> >> >> >> public DispatchHandler newInstance(PredictorProfile predictor) { >> >> return new DispatchHandler(predictor, d1, ...); >> >> } >> >> } >> >> } >> >> >> >> You could also use "Builder" instead of "Factory" depending on how you >> >> structure things. Needing this additional class is unfortunate but >> >> necessary >> >> unless we extend the language to better support this stuff. >> >> >> >> Bob >> >> >> >> On Thu, Oct 16, 2008 at 9:02 AM, Andrew Clegg <[EMAIL PROTECTED]> >> >> wrote: >> >>> >> >>> Hey folks, >> >>> >> >>> I'm just getting started with Guice (and DI in general). I have a >> >>> question, hope it's not too dense. >> >>> >> >>> I have a method that looks something like this in its first >> >>> incarnation (_predictors is a collection): >> >>> >> >>> public boolean dispatch() >> >>> { >> >>> for( PredictorProfile predictor : _predictors ) >> >>> { >> >>> Thread handler = new DispatchHandler( predictor ); >> >>> handler.run(); >> >>> } >> >>> return true; >> >>> } >> >>> >> >>> i.e. for each predictor that the object knows about, kick off a thread >> >>> to process it, and then return. (The return true is just a placeholder >> >>> for a proper status code later.) >> >>> >> >>> Now I've started to think Guicily, I don't like the look of that call >> >>> to new. Everything else in this app so far is injected for me by >> >>> Guice. >> >>> >> >>> What's the best pattern for this kind of situation? >> >>> >> >>> Thanks! >> >>> >> >>> Andrew. >> >>> >> >>> >> >> >> > >> > >> > > >> > >> >> > > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "google-guice" group. To post to this group, send email to google-guice@googlegroups.com 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 -~----------~----~----~----~------~----~------~--~---