Thank you. This is the answer to my question.

On Aug 22, 9:13 am, Jason Winnebeck <[email protected]> wrote:
> It's hard to tell exactly what you are meaning, but I think what you are
> asking is the IState class is generic to IParser, so both excel handler
> and word handler both use the same IState implementation but with two
> different parsers. In this case you're not able to inject the IState
> into the ContentHandler because Guice doesn't know that the IState for
> ExcelHandler needs ExcelParser.
>
> I just had a very similar problem and it is the "robot legs" problem
> mentioned in the FAQ (which you can find example online at the Guice
> site). What I did is made two separate modules (in your case it would be
> WordModule and ExcelModule). In each case there's only one way for
> IState to be constructed so it works. You need to make the modules
> private so that their IState bindings don't conflict. Then you would
> expose() only the content handler in each module. When you make the
> injector you pass both modules. You can pull out the specific content
> handler via the annotation.
>
> Jason
>
> On 8/22/2010 8:07 AM, gregory wrote:
>
> > Newbie Alert .
>
> >   My problem is how to use binding annotation in case when chain of
> > dependency is not defined with the annotation all the way.
>
> > Binding annotations *Excel* and *Word* are used to bind
> > *ContentHandler* and *IParser* interfaces but not *IState* interface
> > (see *MyModule*). The dependency looks like this:
>
> >      ContentHandler ->  IState ->  IParser
>
> >      public class ExcelHandler implements ContentHandler {
>
> >       �...@inject
> >        public ExcelHandler(@Excel IParser parser) {
> >            IState = new State(parser);
> >        }
> >      }
>
> >      public class MyModule extends AbsractModule {
>
> >            protected void configure() {
> >              bind(ContentHandler.class).annotatedWith(Excel.class).
> >                                         to(ExcelContentHandler.class);
> >              bind(ContentHandler.class).annotatedWith(Word.class).
> >                                 to(WordContentHandler.class);
>
> >              bind(IParser.class).annotatedWith(Excel.class).
> >                                 to(ExcelParser.class);
> >              bind(IParser.class).annotatedWith(Word.class).
> >                                to(WordParser.class);
>
> >              bind(IState.class).to(State.class);
> >        }
> >      }
>
> > I obtain initial instance with injector:
>
> >      ContentHandler handler =
> > injector.getInstance(Key.get(ContentHandler.class, Excel.class));
>
> > How to use guice to replace explicit constructor?
>
> >      IState = new State(parser);

-- 
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.

Reply via email to